- Кракозябрица в имени отправителя письма на почте Yandex
- С чего все начиналось
- Решение вопроса
- Кодировка windows 1251 в сайтостроении
- Кодировка windows 1251 в html
- Кодировка windows 1251 в PHP
- Кодировка windows 1251 в htaccess
- Использование кодировок в почтовом сообщении
- ИнтернетПочтовоеСообщение
- ИнтернетПочтовыйАдрес
- ИнтернетПочтовоеВложение
- ИнтернетПочтовыйТекст
- Пример
- Кодировки UTF-8 и Windows 1251 — просто о сложном
- Немного теории
- Недостатки и достоинства
- Базы банных
- Htaccess
Кракозябрица в имени отправителя письма на почте Yandex
Введение
Доброго времени суток, уважаемые!
Хочу кратенько поведать о проблеме отображения имени отправителя письма при отправке на ящики Яндекс.Почты и привести ее решение.
Заранее прошу маститых программистов меня простить. Возможно, для вас эта ситуация не стоит выеденного яйца.
Но мне пришлось посидеть над ее решением. Надеюсь, это может оказаться полезным кому-нибудь.
С чего все начиналось
Итак, есть самописный сайт на php + angular. Обычный лендинг с калькулятором.
Пришла очередь задаче по отправке писем клиентам и менеджерам о поступивших заказах.
Казалось бы, чего уж проще? Берешь и пишешь:
При этом сохраняем файл в кодировке UTF-8 без BOM и выполняем.
Смотрим почтовый ящик gmail — все в порядке! Имя отправителя отображается вполне себе корректно:
Смотрим Яндекс — опять красота.
Уже открываю шампанское… Вот она, победа. Но не тут-то было.
Открываю письмо и вижу:
Убираю шампанское, достаю бубны. Начинаю шерстить интернет в поисках решения, пишу в поддержку Яндекса.
Мне приходит ответ: «Попробуйте кодировать в base64». Что кодировать — я так и не понял. Пробовал кодировать кириллические символы и заголовок целиком.
Но приходит мысль: зачем изобретать велосипед? Надо посмотреть, как делают старшие товарищи по цеху. Открываю первое письмо и смотрю его свойства. Что же я там вижу?
Логика подсказывает, что заветное решение находится внутри символов «=?… ?=» (да простится мне серость моя сообществом мудрейших!).
Смотрю дальше и вижу кодировку windows-1251. Так, еще один шаг к успеху! Подвигаю шампанское ближе.
Затем идет еще символ «B» и знак вопроса. Отбрасываю их, беру оставшийся код и смотрю, что же это такое?
Так, у меня файл с кодировкой utf-8. Сохраняю его как windows-1251 и запускаю снова.
Решение вопроса
Для файлов в кодировке utf-8 я использовал такое решение:
Обратите внимание — тема письма также закодирована:
В результате я получил корректное отображение отправителя письма:
Прошу не судить строго за мой первый литературно-технический очерк. Буду благодарен профессиональным отзывам и дополнением материала.
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.
- 17 января 2021 в 21:55 Как найти email пользователя GitHub и написать Telegram бота для решения этой задачи?
- 15 февраля 2021 в 01:06 Еще одна реализация DI на PHP
- 6 апреля 2021 в 15:40 Собеседование на PHP разработчика. Более 100 вопросов для Junior, Middle и Senior
- 10 апреля 2021 в 00:24 Простое решение для раздачи файлового архива через временные WEB-ссылки
- 15 апреля 2021 в 13:08 Как я 30 дней авто обновление валюты чинил Opencart 3.0
Это «Песочница» — раздел, в который попадают дебютные посты пользователей, желающих стать полноправными участниками сообщества.
Если у вас есть приглашение, отправьте его автору понравившейся публикации — тогда её смогут прочитать и обсудить все остальные пользователи Хабра.
Чтобы исключить предвзятость при оценке, все публикации анонимны, псевдонимы показываются случайным образом.
Не надо пропускать:
- рекламные и PR-публикации
- вопросы и просьбы (для них есть Хабр Q&A);
- вакансии (используйте Хабр Карьеру)
- статьи, ранее опубликованные на других сайтах;
- статьи без правильно расставленных знаков препинания, со смайликами, с обилием восклицательных знаков, неоправданным выделением слов и предложений и другим неуместным форматированием текста;
- жалобы на компании и предоставляемые услуги;
- низкокачественные переводы;
- куски программного кода без пояснений;
- односложные статьи;
- статьи, слабо относящиеся к или не относящиеся к ней вовсе.
Кодировка windows 1251 в сайтостроении
Кодировка windows 1251 была создана в начале 90 годов для русификации программных продуктов, выпускаемых корпорацией Microsoft :
- 0xFF (25510) – это код, который зарезервирован для символа «я». В программах, которые не поддерживают чистый 8-ой бит, часто возникают непредсказуемые проблемы;
- Нет псевдографики, которая присутствует в KOI8 , CP866 .
Ниже приведены символы из Code Page 1251 или сокращенно СР1251 ( числа под символами являются кодом в шестнадцатеричной системе такого же символа в Юникоде ):
Кодировка windows 1251 в html
Нередко у web-разработчиков и блогеров, обладающих различной квалификацией возникает проблема с кодировкой страниц: вместо подготовленного текста появляются неизвестные, нечитаемые символы. Чтобы разобраться с данной проблемой, необходимо понимать суть термина « кодировка страницы ».
Текст в памяти компьютера хранится в виде определенного количества байт, а не в том виде, в котором он отображается в текстовом редакторе. Каждый байт является кодом, который соответствует одному символу. Для того чтобы текст на странице отображался как следует, нужно сообщить браузеру, какую таблицу кодов для расшифровки и отображения он должен использовать.
Таблица кодировок не является универсальной, то есть, для расшифровки текста необходимо использовать ту, которая соответствует кодировке символов:
— между тегом и закрывающим его нужно прописать — исходя из этой строки, браузер будет использовать символы русского алфавита для отображения текста на странице.
Кодировка windows 1251 в PHP
Ни для кого не является тайной, что генерация страниц проходит путем выборки и использования какой-то части информации, которая хранится в базе данных. При написании сайта на PHP , чаще всего это mysql :
Для согласования расшифровки необходимо выполнить функцию mysql_query(«SET NAMES cp1251») – это означает, что преобразование из машинного кода будет осуществляться согласно таблице cp1251 .
Кодировка windows 1251 в htaccess
При создании сайта, предварительно настроив кодировки в шаблонах и базах данных, все равно может всплыть проблема некорректного отображения информации в браузере.
Для того чтобы для веб-ресурса была задана кодировка виндовс-1251 , необходимо найти ( или создать ) файл .htaccess . Это файл, который хранит в себе дополнительные настройки и описания конфигураций web-сервера.
В нем для установки кодировки следует прописать следующие строки:
- DefaultLanguage ru;
- AddDefaultCharset windows-1251;
- php_value default_charset «cp1251».
Таким образом, для корректного отображения текста должны совпадать его кодировка и таблица кодов, с помощью которой браузер будет расшифровывать символы. Для текстов, написанных на славянских языках, необходима win 1251 кодировка. Важно помнить, что элементы страниц и баз данных должны быть описаны с помощью одной таблицы кодов.
Использование кодировок в почтовом сообщении
При работе с электронной почтой существует возможность указывать кодировку для объектов ИнтернетПочтовоеСообщение , ИнтернетПочтовыйАдрес , ИнтернетПочтовоеВложение , ИнтернетПочтовыйТекст .
Сообщение состоит из двух главных частей — заголовка сообщения и тела письма. Тело письма, в свою очередь, может содержать подчасти, каждая из которых также состоит из заголовка подчасти и тела подчасти. Кодировка указывается в заголовках, а также отдельно (но в заголовке) для отображаемых имен и имен вложений (которые также находятся в заголовке). При чтении письма большим приоритетом обладает кодировка, указанная для отображаемых имен и имен вложений, затем кодировка, указанная в заголовке подчасти, и, наконец, меньший приоритет имеет кодировка, указанная в главном заголовке сообщения.
У каждого из перечисленных выше объектов есть свойство Кодировка . Это свойство принимает текстовое наименование кодировки для отправляемых сообщений или содержит текстовое представление кодировки полученного сообщения. В случае, если кодировка в принятом сообщении не указана (например, когда все символы в сообщении занимают не больше 7 бит на символ или когда указана кодировка для всего сообщения в целом), свойство Кодировка пустое. По умолчанию для отправляемых сообщений используется кодировка utf-8.
Ниже перечислены допустимые кодировки (указывать кодировку нужно строго в том виде, в котором она представлена):
- ibm852 (Центральноевропейская DOS);
- ibm866 (Кириллица DOS);
- iso-8859-1 (Западноевропейская ISO);
- iso-8859-2 (Центральноевропейская ISO);
- iso-8859-3 (Латиница 3 ISO);
- iso-8859-4 (Балтийская ISO);
- iso-8859-5 (Кириллица ISO);
- iso-8859-7 (Греческая ISO);
- iso-8859-9 (Турецкая ISO);
- iso-8859-15 (Латиница 9 ISO);
- koi8-r (Кириллица KOI8-R);
- koi8-u (Кириллица KOI8-U);
- us-ascii (США);
- utf-8 (Юникод UTF-8);
- windows-1250 (Центральноевропейская Windows);
- windows-1251 (Кириллица Windows);
- windows-1252 (Западноевропейская Windows);
- windows-1253 (Греческая Windows);
- windows-1254 (Турецкая Windows);
- windows-1257 (Балтийская Windows).
ИнтернетПочтовоеСообщение
Через свойство Кодировка данного объекта можно указать кодировку темы и всего сообщения. В случае если кодировка не указана, используется кодировка по умолчанию. Например:
Тема сообщения отправится в кодировке «windows-1251».
ИнтернетПочтовыйАдрес
Через свойство Кодировка данного объекта можно указать кодировку для свойства ОтображаемоеИмя . Если свойство Кодировка не установлено, то кодировка будет браться из объекта ИнтернетПочтовоеСообщение . Если же свойство Кодировка объекта ИнтернетПочтовоеСообщение также не установлено, будет использоваться кодировка по умолчанию. Например:
Копировать в буфер обменаОтображаемое имя адресата «postmaster@foobar.org» будет послано в кодировке «koi8-r», а «user@foobar.org» в кодировке «windows-1251».
ИнтернетПочтовоеВложение
Через свойство Кодировка данного объекта можно указать кодировку имени вложения, а также имени файла вложения. Если свойство Кодировка не установлено, то кодировка будет браться из объекта ИнтернетПочтовоеСообщение . Если же свойство Кодировка объекта ИнтернетПочтовоеСообщение также не установлено, будет использоваться кодировка по умолчанию. Например:
Как и имя файла вложения, так и имя вложения отправятся в кодировке «koi8-u».
ИнтернетПочтовыйТекст
Через свойство Кодировка данного объекта можно указать кодировку для свойства ОтображаемоеИмя . Если свойство Кодировка не установлено, то кодировка будет браться из объекта ИнтернетПочтовоеСообщение . Если же свойство Кодировка объекта ИнтернетПочтовоеСообщение также не установлено, будет использоваться кодировка по умолчанию. Например:
Текст сообщения отправится в кодировке «koi8-r».
Пример
Следующий пример иллюстрирует использование кодировок в различных частях почтового сообщения:
Кодировки UTF-8 и Windows 1251 — просто о сложном
Здравствуйте, уважаемые читатели моего блога. Сегодня мы поговорим с вами про кодировку. Если вы читали мою статью о том, как посмотреть код страницы в браузере, то знаете, что любой документ в интернете хранится не в том виде, в каком мы привыкли его видеть. Он записан при помощи непонятных человеку символов и знаков. С текстом все точно также.
Существует несколько кодировок, а потому, иногда увидев непонятные символы при открытии книги в мобильном приложении или запилив статью на сайт, вы, поменяв кое-какие значения в настройках, увидите привычный глазу алфавит.
Кодировка windows-1251 – что это такое, какое значение она имеет при создании сайта, какие символы будут доступны и является ли она лучшим решением на сегодняшний день? Обо всем этом в сегодняшней статье. Как всегда, простым языком, максимально понятно и с минимальным количеством терминов.
Немного теории
Любой документ на компьютере или в интернете, как я уже сказал, хранится в виде двоичного кода. К примеру, если вы используете кодировку ASCII, то буква «К» будет записана как 10001010, а windows 1251 под этим числом скрывается символ – Љ. В итоге, если браузер или программа обратится к другой таблице и считает вместо ASCII коды windows 1251, то читатель увидит совершенно непонятные ему символ.
Логичен вопрос, нафига было придумывать множество таблиц с кодами? Дело в том, что помимо русского алфавита существует еще и английский, немецкий, китайский. По некоторым подсчетам, существует около 200 000 символов. Хотя, я не очень доверяю этой статистике, вспоминая про японский.
Не забывайте, что для заглавной и строчной буквы нужно придумать свой код, есть запятые, тире и так далее.
Чем больше в таблице символов, тем длиннее код каждого из них, а значит и вес документа становится больше.
Представьте, если бы одна книга весила 4 Гб! Она бы очень долго загружалась, занимала все свободное место на компьютере. Решение о скачивании представлялось бы делом нелегким.
Если вспомнить о сайтах, то вообще страшно подумать, что бы произошло. Каждая страничка открывалась даже на скоростном оптоволокне по часу с лишним! Думаю, мобильные телефоны можно было бы смело выкидывать. Пользоваться ими на улице даже с 4G? Сомневаюсь.
По этим причинам каждый программист в свое время старался придумать свою таблицу символов. Чтобы было удобно для использования и вес сохранялся оптимальным.
Microsoft, к примеру, для русскоязычного сегмента создали windows-1251. В ней, конечно же, есть свои достоинства и недостатки. Как и у любого другого продукта.
Сейчас уже, лишь 2% всех страниц в интернете написано на 1251. Большинство веб-мастеров используют UTF-8. Почему так?
Недостатки и достоинства
UTF-8, в отличие от windows-1251 универсальная кодировка, в ней содержатся буквы различных алфавитов. Существует даже UTF-128, где есть вообще все языки – теулу, суахили, лаосский, мальтийский и так далее.
UTF-8 победнее, буквы занимают в разы меньше места и занимают всего один байт памяти, как и в 1251. В УТФ есть редкие символы из других языков или специальные символы. Они-то и весят по 5-6 байтов, но в документе используются крайне редко.
Эта кодировка более продумана, а потому ее использует большинство приложений по умолчанию. То есть, если вы не указываете программе, какую кодировку вы используете, то первым делом он проверит именно UTF-8 .
Когда вы создаете html документ для сайта, то указываете браузерам на какую таблицу им обращать внимание при расшифровке записей.
Для этого необходимо вставить в тег head следующие данные. После символов «charset=» идет либо утф, либо виндовс, как в примере ниже.
Если в дальнейшем вы захотите что-то поменять и вставить фразу на албанском, используя эту таблицу расшифровок, то ничего не получится, ведь этого языка кодировка не поддерживает. UTF‑8 без проблем позволит вам это сделать.
Если вас заинтересовало правильное создание сайта, то я могу порекомендовать вам курс Михаила Русакова « Создание и Раскрутка сайта от А до Я ».
Он содержит в себе очень много – 256 уроков, затрагивающих HTML, CSS, JavaScript, PHP, MySQL и XML. Помимо языков программирования вы сможете понять как монетизировать сайт, то есть скорее и больше получать прибыль. Один из немногих курсов, в котором было бы так подробно разъяснено все, что нужно.
Сам я вот уже год обучаюсь в школе блоггеров Александра Борисова . Это занимает в разы больше времени, конца и края пока не видно, но зато не менее исчерпывающе и дисциплинирует. Мотивирует продолжать разработку.
Ну а если возникают вопросы, не нужно искать по интернету. Всегда есть грамотный наставник.
Что-то я отошел от темы. Давайте вернемся к кодировкам.
Базы банных
Когда речь идет о php, все вообще страшно. Я уже рассказывал про базы данных, они используются для ускорения работы сайта. Обычно, вы к ним не обращаетесь, но когда появляется необходимость в переносе сайта становится не по себе.
Сложности случаются у всех, не важно какой у вас опыт работы, стаж и выслуга лет. Некоторые странички в базе могут содержать в себе все доступные символы для виндовс-1251, другие, к примеру, в шаблонах страниц, в другой кодировке.
Пока не нужен перенос все работает и функционирует, хоть и не совсем правильно. Но после переезда начинаются неприятности. В идеале вы должны использовать либо только УТФ, либо виндовс-1251, но по факту всегда и у всех случаются вот такие недочеты.
Чтобы расшифровка согласовалась необходимо вписать код mysql_query(«SET NAMES cp1251»). В этом случае преобразование будет осуществлять по другому протоколу – cp1251.
Htaccess
Если на сайте вы настойчиво решили использовать именно 1251, то вам следует найти или создать файл htaccess. Он отвечает за настройки конфигурации. В него придется добавить еще три строчки, чтобы все сошлось.
DefaultLanguage ru; AddDefaultCharset windows-1251; php_value default_charset «cp1251»
Я все же настоятельно рекомендую вам задумать о использовании UTF-8. Он более популярен, прост и богат. Какие бы решения вы не приняли сейчас, важно, чтобы впоследствии можно было все исправить. Добавить англоязычную версию сайта на этой кодировке будет в разы проще. Ничего не нужно исправлять.
Решение остается за вами. Подписывайтесь на рассылку, чтобы узнавать как можно быстрее создавать правильные сайты, где учиться, чтобы не повторять чужих ошибок, а также какие блоггеры получают больше посетителей.
До новых встреч и удачи в ваших начинаниях.