Как лучше кодировать сайт? Какие проблемы с кодировкой на сайте

Как лучше кодировать сайт? Какие проблемы с кодировкой на сайте Хостинг

Язык гипертекстовой разметки HTML используется с 1991 года, но версия 4.0 (1997) была первой, где представление символов, отличных от ASCII (то есть, английского языка), достаточно стандартизировано.

Содержание
  1. Что такое кодировка?
  2. Что такое атрибуты?
  3. Что такое кодировка сайта
  4. Небольшая вводная в кодировки
  5. Использование UTF-8 в теле сообщения
  6. Проставляем UTF-8 сообщение в значение заголовка
  7. Транслит
  8. RFC 2047
  9. RFC 6266
  10. Что делать с другими заголовками?
  11. Настройка кодировки сайта
  12. Какие существуют кодировки
  13. Windows-1251
  14. KOI8-R
  15. СсылкиПравить
  16. Как определить кодировку на сайте
  17. Кодировка базы данных
  18. Пятый и шестой байтыПравить
  19. Смена кодировки базы данных
  20. Как установить кодировку сайта
  21. Opera
  22. Google Chrome
  23. Мнемоники HTML и коды UnicodeПравить
  24. Типы кодировок
  25. Автоматическое распознавание кодировокПравить
  26. Дополнительное видео по теме
  27. Маркер UTF-8Править
  28. Кодировки и веб-страницы
  29. Определение кодировки средствами HTTPПравить
  30. Набор символов
  31. Где и как изменить кодировку
  32. Алгоритм кодированияПравить
  33. Набор символов в компьютереПравить
  34. Возможные ошибки декодированияПравить
  35. Как узнать кодировку сайта
  36. По метатегу
  37. Через инструментарий браузера
  38. Определение кодировки средствами XMLПравить
  39. Проблемы с кодировкой на сайте

Что такое кодировка?

Кодировка, это набор символов, представленный в таблице. Таблица содержит сам символ и его код, например, двоичный (нули и единицы). Термин «набор символов» редко используется, чаще всего говорят «кодировка». На данный момент популярны две кодировки: ASCII и UTF-8. На нашем сайте используется кодировка UTF-8.

Иногда возникают случаи, когда при открытии сайта отображается не привычный нам контент, а сплошной набор нечитаемых символов. Это связано с тем, что кодировка ресурса не совпадает с той кодировкой, которая устанавливается сервером. Например, для чтения файлов используется Windows-1251, а требуется UTF-8.

Что такое кодировка сайта и как ее можно изменить – об этом и поговорим в сегодняшней статье.

Что такое атрибуты?

Настало время познакомиться с атрибутами в HTML. Вы их уже встречали, просто на них не акцентировалось внимание. Атрибуты – это дополнение к тегам, расширяющее их возможности. Они всегда указываются в открывающемся теге. Атрибут состоит из имени и значения, разделенного знаком равенства.

Имя атрибута необходимо писать в нижнем регистре. Хотя HTML5 и позволяет писать в любом регистре и не использовать кавычки, все же так не рекомендуется делать.

Есть проблемы с ранжированием, проект не растет, хотите проверить работу своих специалистов по продвижению? Закажите профессиональный аудит в Семантике

Как лучше кодировать сайт? Какие проблемы с кодировкой на сайте

Получи нашу книгу «Контент-маркетинг в социальных сетях: Как засесть в голову подписчиков и влюбить их в свой бренд».

Как лучше кодировать сайт? Какие проблемы с кодировкой на сайте

Кодировка сайта – это набор взаимосвязанных кодов и соответствующего им графического отображения печатных элементов на экране.

Кодировка – специальный метод, позволяющий отображать текст на экране таким образом, чтобы он был понятен каждому пользователю. Все символы, которые мы видим в интернете, – это буквы и цифры только для нас, компьютер их не понимает. Он воспринимает информацию в байтах, весь текст на экране монитора – это совокупность байтов. У каждого символа есть свое кодовое значение, которое компьютер использует при выводе слов и чисел на экран.

Вот наглядный пример того, как воспринимается компьютером латинский алфавит и прочие символы:

Как лучше кодировать сайт? Какие проблемы с кодировкой на сайте

Если никакая кодировка не установлена, вместо символов мы увидим такие значения. Чтобы понять компьютер, необходимо установить нужную кодировку для расшифровки символов из этой таблицы.

Комьюнити теперь в Телеграм

Подпишитесь и будьте в курсе последних IT-новостей

UTF-8 (от англ. Unicode Transformation Format, 8-bit — «формат преобразования Юникода, 8-бит») — распространённый стандарт кодирования символов, позволяющий более компактно хранить и передавать символы Юникода, используя переменное количество байт (от 1 до 4), и обеспечивающий полную обратную совместимость с 7-битной кодировкой ASCII. Стандарт UTF-8 официально закреплён в документах RFC 3629 и ISO/IEC 10646 Annex D.

Что такое кодировка сайта

Все виды кодировок на сайтах, в сообщениях электронной почты, файлах и текстах нужны для одной и той же цели – сохранить информацию в привычном для машины, двоичном представлении.

Представьте, что у вас есть друг, который из всех символов понимает только ноль и единицу. Он с детства не знает ни букв, ни других цифр, и может читать сообщения, состоящие исключительно из сочетаний этих двух символов. Как с ним общаться, как говорить ему слова, как понимать его ответы – типичные вопросы, которые бы возникли у вас в начале общения. Решение следующее: составьте таблицу, по которой каждая буква, символ, цифра или знак препинания будут означать какую-то последовательность из нулей и единиц. Начните общаться с вашим другом по этому правилу, шифруйте все свои слова в двоичный вид и расшифровывайте его ответы.

А что, если таких человек в мире несколько десятков? Каждый имеет своих друзей, и каждый придумал собственную таблицу перевода букв в цифры. Если они встретятся друг с другом, никто ничего не поймёт, все они используют разные табличные языки общения. У одного буква «А» значит — 000101, а у другого этому коду соответствует вопросительный знак. Возникнет страшная путаница, каждый подумает, что его собеседник ошибся или не умеет говорить.

Вернёмся в реальность. Наши необычные друзья – это компьютеры. А их выдуманные языки с таблицами – те самые кодировки.

Время на прочтение

Как лучше кодировать сайт? Какие проблемы с кодировкой на сайте

Как известно, HTTP 1.1 — это текстовой протокол передачи данных. HTTP сообщения закодированы, используя ISO-8859-1 (которую условно можно считать расширенной версией ASCII, содержащей умляуты, диакритику и другие символы, используемые в западноевропейских языках). При этом в теле сообщений можно использовать другую кодировку, которая должна быть обозначена в заголовке «Content-Type». Но что делать, если нам необходимо задать non-ASCII символы не в теле сообщения, а в самих заголовках? Наверное, самый распространенный кейс — это проставление имени файла в «Content-Disposition» заголовке. Это, казалось бы, довольно распространенная задача, но ее реализация не так очевидна.

TL;DR: Используйте кодировку, описанную в RFC 6266, для «Content-Disposition» и преобразуйте текст в латиницу (транслит) в остальных случаях.

Небольшая вводная в кодировки

В статье упоминаются и используются кодировки US-ASCII (часто именуемую просто ASCII), ISO-8859-1 и UTF-8. Это небольшая вводная в эти кодировки. Раздел предназначен для разработчиков, которые редко или совсем не работают с кодировками и успели подзабыть их. Если вы к ним не относитесь, то смело пропускайте раздел.

ASCII — это простая кодировка, содержащая 128 символов и включающая весь английский алфавит, цифры, знаки препинания и служебные символы.

Как лучше кодировать сайт? Какие проблемы с кодировкой на сайте

7 бит достаточно, чтобы представить любой ASCII символ. Слово «test» будет представлено в HEX представлении, как 0x74 0x65 0x73 0x74. Первый бит у всех символов всегда 0, поскольку символов в кодировке 128, а байт предоставляет 2^8 = 256 вариантов.

ISO-8859-1 — кодировка, предназначенная для западноевропейских языков. Содержит французскую диакритику, немецкие умляуты и т.д.

Как лучше кодировать сайт? Какие проблемы с кодировкой на сайте

Кодировка содержит 256 символов и, таким образом, может быть представлена одним байтом. Первая половина (128 символов) полностью совпадает с ASCII. Таким образом, если первый бит = 0, то это обычный ASCII символ. Если 1, то это символ, специфичный для ISO-8859-1.

UTF-8 — одна из самых известных кодировок наравне с ASCII. Способна кодировать 1.112.064 символов. Размер каждого символа варьируется от 1-го до 4-х байт (раньше допускались значения до 6 байт).

Как лучше кодировать сайт? Какие проблемы с кодировкой на сайте

Программа, работающая с этой кодировкой, определяет по первым битам, как много байтов входит в символ. Если октет начинается с 0, то символ представлен одним байтом. 110 — два байта, 1110 — три байта, 11110 — 4 байта.

Как и в случае с ISO-8859-1, первые 128 символов полностью соответствуют ASCII. Поэтому тексты, использующие только ASCII символы, будут абсолютно идентичны в бинарном представлении, вне зависимости от того, использовалась ли для кодирования US-ASCII, ISO-8859-1 или UTF-8.

Использование UTF-8 в теле сообщения

Как лучше кодировать сайт? Какие проблемы с кодировкой на сайте

Если «Content-Type» не задан, то браузер должен обрабатывать сообщения, как будто они написаны в ISO-8859-1. Браузер не должен пытаться отгадать кодировку и, тем более, игнорировать «Content-Type». Но, что реально отобразится в ситуации, когда «Content-Type» не передан, зависит от реализации браузера. Например, Firefox сделает согласно спецификации и прочитает сообщение, будто оно было закодировано в ISO-8859-1. Google Chrome, напротив, будет использовать кодировку операционной системы, которая для многих российских пользователей равна Windows-1251. В любом случае, если сообщение было в UTF-8, то оно будет отображено некорректно.

Как лучше кодировать сайт? Какие проблемы с кодировкой на сайте

Проставляем UTF-8 сообщение в значение заголовка

С телом сообщения все достаточно просто. Тело сообщения всегда следует после заголовков, поэтому здесь не возникает технических проблем. Но как быть с заголовками? В спецификации недвусмысленно заявляется, что порядок заголовков в сообщении не имеет значения. Т.е. задать кодировку в одном заголовке через другой заголовок не представляется возможным.

Что будет, если просто взять и записать UTF-8 значение в значение заголовка? Мы видели, что такой трюк с телом сообщения приведет к тому, что значение будет просто прочитано в ISO-8859-1. Логично было бы предположить, что то же самое произойдет с заголовком. Но это не так. Фактически, во многих, если не в большинстве, случаях такое решение будет работать. Сюда включаются старые айфончики, IE11, Firefox, Google Chrome. Единственным из находящихся у меня под рукой браузеров, когда я писал эту статью, который не захотел работать с таким заголовком, является Edge.

Читайте также:  Поиск VPS — обновленная версия / Хабр

Как лучше кодировать сайт? Какие проблемы с кодировкой на сайте

Такое поведение не зафиксировано в спецификациях. Возможно, разработчики браузеров решили облегчить жизнь разработчиков и автоматически определять, что в заголовках сообщение закодировано в UTF-8. В общем-то, это не является такой сложной задачей. Смотрим на первый бит: если 0, то ASCII, если 1 — то, возможно, UTF-8.

Однако, при попытке использовать этот способ можно столкнуться с техническими проблемами: ваш веб-сервер или фреймворк может просто не разрешить записывать UTF-8 символы в значение заголовка. Например, Apache Tomcat вместо всех UTF-8 символов проставляет 0x3F (вопросительный знак). Разумеется, это ограничение можно обойти, но, если само приложение бьет по рукам и не дает что-то сделать, то, возможно, вам и не нужно это делать.

Но, независимо от того, разрешает ли вам ваш фреймворк или сервер записать UTF-8 сообщения в заголовок или нет, я не рекомендую этого делать. Это не задокументированное решение, которое в любой момент времени может перестать работать в браузерах.

Транслит

Я думаю, что использовать транслит — eto bolee horoshee reshenie. Многие крупные популярные русские ресурсы не брезгуют использовать транслит в названиях файлов. Это гарантированное решение, которое не сломается с выпуском новых браузеров и которое не надо тестировать отдельно на каждой платформе. Хотя, разумеется, надо подумать, как преобразовывать весь спектр возможных символов, что может быть не совсем тривиально. Например, если приложение рассчитано на российскую аудиторию, то в имя файла могут попасть татарские буквы ә и ң, которые надо как-то обработать, а не просто заменять на «?».

RFC 2047

Как я уже упомянул, томкат не позволил мне проставить UTF-8 в заголовке сообщения. Отражена ли эта особенность поведения в Java docs для сервлетов? Да, отражена:

Как лучше кодировать сайт? Какие проблемы с кодировкой на сайте

Упоминается RFC 2047. Я пробовал кодировать сообщения, используя этот формат, — браузер меня не понял. Этот метод кодировки не работает в HTTP. Хотя работал раньше. Вот, например, тикет на удаление поддержки этой кодировки из Firefox.

RFC 6266

В тикете, ссылка на который содержится в предыдущем разделе, есть упоминания, что даже после прекращения поддержки RFC 2047, все еще есть способ передавать UTF-8 значения в названии скачиваемых файлов: RFC 6266. На мой взгляд, это самое правильно решение на сегодняшний день. Многие популярные интернет ресурсы используют его. Мы в CUBA Platform также используем именно этот RFC для генерации «Content-Disposition».

RFC 6266 — это спецификация, описывающая использование “Content-Disposition” заголовка. Сам способ кодировки подробно описан в другой спецификации — RFC 8187.

Как лучше кодировать сайт? Какие проблемы с кодировкой на сайте

Параметр “filename” содержит название файла в ASCII, “filename*” — в любой необходимой кодировке. При наличии обоих атрибутов “filename” игнорируется во всех современных браузерах (включая IE11 и старые версии Safari). Совсем старые браузеры, напротив, игнорируют “filename*”.

При использовании данного способа кодирования в параметре сначала указывается кодировка, после » идет закодированное значение. Видимые символы из ASCII кодирования не требуют. Остальные символы просто пишутся в hex представлении, со стоящим «%» перед каждым октетом.

Что делать с другими заголовками?

Кодирование, описанное в RFC 8187, не является универсальным. Да, можно поместить в заголовок параметр с * префиксом, и это, возможно, будет даже работать для некоторых браузеров, но спецификация предписывает не делать так.

В каждом случае, где в заголовках поддерживается UTF-8, на настоящий момент есть явное упоминание об этом в релевантном RFC. Помимо «Content-Disposition» данная кодировка используется, например, в Web Linking и Digest Access Authentication.

Следует учесть, что стандарты в этой области постоянно меняются. Использование описанной выше кодировки в HTTP было предложено лишь в 2010. Использование данной кодировки именно в «Content-Disposition» было зафиксировано в стандарте в 2011. Несмотря на то, что эти стандарты находятся лишь на стадии «Proposed Standard», они поддержаны повсеместно. Вариант, что в будущем нас ожидают новые стандарты, которые позволят более унифицировано работать с различными кодировками в заголовках, не исключен. Поэтому остается только следить за новостями в мире стандартов HTTP и уровня их поддержки на стороне браузеров.

  • Usage Statistics of Character Encodings for Websites, June 2011 (англ.)
  • . Дата обращения: 27 февраля 2007. Архивировано из оригинала 1 марта 2011 года. (англ.)
  • Well, I’m Back.  . Robert O’Callahan (1 марта 2008). Дата обращения: 1 марта 2008. Архивировано 23 августа 2011 года.
  • Ростислав Чебыкин. Всем кодировкам кодировка. UTF‑8: современно, грамотно, удобно. HTML и CSS. Дата обращения: 22 марта 2009. Архивировано 23 августа 2011 года.

Еще один распространенный случай — когда соединение с базой использует по умолчанию кодировку UTF-8, а файлы сайта открываются в браузере в другой кодировке. (Могут выводиться символы раняРвместо кириллицы.)

Для устранения проблемы рекомендуем указать кодировку по умолчанию в . Он располагается в папке public_html в директории вашего сайта.

Добавьте в файл строку:

При такой настройке сервер будет использовать для отображения сайта именно указанную кодировку.

Настройка кодировки сайта

Если вы владелец проблемного сайта, на который жалуются посетители за неправильно работающую кодировку, стоит заново настроить портал для правильной работы по следующим пунктам. Главное правило, которое должно действовать для всего проекта – единая кодировка файлов, скриптов, баз данных и сервера.

  • Сохраните все файлы сайта в единой кодировке. При необходимости измените её с помощью специальных программ, например Notepad++.
  • Установите в html кодетеги кодировок. Для UTF8 кодировки это будет.
  • Задайте кодировку серверных заголовков по умолчанию. Без этого браузер будет игнорировать даже метатеги.
  • Отредактируйте файл httpd.conf. Найдите параметр AddDefaultCharset и установите необходимое значение.
  • Если у вас нет доступа к корневым настройкам веб-сервера, отредактируйте файл .htaccess в папке ресурса. Укажите вручную параметр AddDefaultCharset с вашей кодировкой сайта.
  • Существует возможность отправки заголовков средствами скриптов. Например, в PHP-скриптах достаточно добавить header(«Content-type: text/html; Charset=utf-8»). Отправка заголовков – приоритетная задача, и она должна выполняться в первую очередь перед выводом контента.

Придется вручную установить верную кодировку соединения для подключаемых модулей. Приведем пример конфигурации для популярной БД MySQL:

  • Откройте на сервере конфиг my.cnf.
  • Задайте принудительную кодировку при каждом обращении в PHP.
  • mysqli_query(‘SET NAMES utf8 COLLATE utf8_general_ci’).

Неверная настройка кодировки сайта может навредить вашим посетителям, за счёт чего вы потеряете посещаемость и доход. Заходя на сайт, аудитория увидит непонятные отталкивающие наборы несвязанных символов. Никто не станет настраивать все вручную, чтобы поменять кодировку сайта на правильную, 95% пользователей просто уйдут со страницы. Подходите к этой проблеме с максимальной ответственностью. От правильного выбора кодировки зависит дальнейшая работа всего проекта.

Какие существуют кодировки

Перечислим несколько наиболее удобных и популярных способов кодирования:

Unicode Transformation Format. Восьмибитное представление Юникода. Был изобретён в 1992 году и до сих пор является золотым стандартом всего программного обеспечения в мире. Для кириллицы в Юникоде выделено два раздела: Cyrillic и Cyrillic Supplement.

Windows-1251

Создана в 1990 году специально для русификаторов операционной системы Microsoft Windows. Кириллическая восьмибитная кодировка, занимает второе место по популярности.

KOI8-R

Восьмибитный стандарт кириллического кодирования. Если убрать у каждого символа восьмой бит, мы получим транскрипцию русских букв на латиницу. Иногда его применяют в электронной почте, но на сегодняшний день в интернете встречается редко.

Как лучше кодировать сайт? Какие проблемы с кодировкой на сайте

СсылкиПравить

Часто проблема связана с тем, что для файлов сайта используется кодировка cp1251, а для содержимого базы данных — UTF-8. В этом случае на сайте часть текста отображается корректно, а часть — в виде вопросительных знаков.

Чтобы ее устранить, необходимо добавить в файл скрипта, который содержит данные для подключения к базе данных, следующие строки:

mysql_query(«SET NAMES ‘cp1251’ COLLATE ‘cp1251_general_ci'»);mysql_query(«SET CHARACTER SET ‘cp1251′»);

Если используется mysqli:

mysqli_query($link, «SET NAMES ‘cp1251’ COLLATE ‘cp1251_general_ci'»);mysqli_query($link, «SET CHARACTER SET ‘cp1251′»);

Как определить кодировку на сайте

Узнать кодировку своего или чужого сайта довольно просто, достаточно просмотреть исходный код страницы. Сделать это можно следующим образом:

  • Открываем сайт, на котором необходимо посмотреть кодировку, и кликаем правой кнопкой мыши по любой области. В отобразившемся меню выбираем «Просмотр кода страницы». Также можно воспользоваться комбинацией клавиш «CTRL+U».
  • В результате перед нами отобразится новое окно с кодом страницы – в нем воспользуемся комбинацией клавиш «CTRL+F» для поиска строки, отвечающей за кодировку веб-страницы. Вводим запрос «charset» и смотрим результат.
Читайте также:  Помогите - Какой хостинг для майна лучший | Bukkit по-русски - свой сервер Minecraft

Как лучше кодировать сайт? Какие проблемы с кодировкой на сайте

После charset указано значение UTF-8 – это означает, что данная кодировка используется на рассматриваемом сайте. Если вы увидели, что на вашем сайте указана некорректная кодировка, то это можно исправить. Подробнее о том, как это сделать, поговорим далее.

Кодировка базы данных

В отдельных случаях может потребоваться изменить кодировку в базе данных MySQL.

Например, чтобы установить по умолчанию кодировку UTF-8, выполните следующее:

  • Выберите нужную базу в списке баз слева.
  • Перейдите в раздел Операции

Как лучше кодировать сайт? Какие проблемы с кодировкой на сайте

  • Сравнение / Collation выберите utf8_general_ci
  • Отметьте галочками оба пункта.
  • Вперед

Как лучше кодировать сайт? Какие проблемы с кодировкой на сайте

Пятый и шестой байтыПравить

Изначально кодировка UTF-8 допускала использование до шести байтов для кодирования одного символа, однако в ноябре 2003 года стандарт RFC 3629 запретил использование пятого и шестого байтов, а диапазон кодируемых символов был ограничен символом U+10FFFF. Это было сделано для обеспечения совместимости с UTF-16.

Смена кодировки базы данных

В данном случае нам потребуется открыть базу данных через личный кабинет хостинга и изменить значение кодировки в разделе «Операции». Давайте рассмотрим, как это можно сделать через админку Timeweb.

  • В отобразившемся окне вводим пароль и следуем далее.
  • Переходим к нужной базе данных и в верхнем меню выбираем «Операции».
  • Указываем в нижнем блоке значение «utf8mb4_general_ci» и в правой части жмем на кнопку «Вперед».

На этом статья подходит к концу. Теперь вы знаете больше о кодировке сайта и можете легко ее изменить в случае необходимости. Спасибо за внимание!

Как установить кодировку сайта

Вы открыли сайт, но вместо текста видите непонятные закорючки, иностранные символы или цифры. Чтобы привести страницу к обычному виду, нужно вручную задать используемую кодировку.

  • Mozilla Firefox
  • Заходим в меню – три горизонтальные полосы справа.
  • Выбираем категорию «Еще».
  • Далее раздел «Кодировка текста».
  • Выбираем необходимую опцию.

Opera

  • Заходим настройки.
  • Выбираем «Веб-сайты».
  • Переходим в блок «Отображение».
  • Далее – «Настроить шрифты».
  • В конце выбираете кодировку.

Google Chrome

  • Перейдите в меню – три точки справа вверху.
  • Выберите пункт «Дополнительные инструменты».
  • Откройте раздел «Кодировка».
  • Откроется окно с выбором различных кодировок.

Мнемоники HTML и коды UnicodeПравить

Символы, имеющие специальные названия (см. Мнемоники в HTML), могут быть закодированы в виде &entity;, например:

В то же время все символы могут быть также закодированы в числовом обозначении с использованием десятичного (&#DD;) или шестнадцатеричного (&#xHHHH;) кода Unicode.

Правильный браузер будет отображать символы, заданные вышеназванным путём, независимо от текущей кодировки документа и, в частности, даже в случае, когда такие символы ею не могут быть охвачены. Таким образом, возможен японский текст в HTML-документе, написанном в Windows-1251, и т. д.

Типы кодировок

Существует несколько типов кодировок:

  • ASCII – первая кодировка, которая была признана Американским национальным институтом мировых стандартов. Для ее использования задействуется 7 бит, где первые 128 значений включают в себя весь английский алфавит, числа, знаки и символы. Такая кодировка ранее использовалась на англоязычных ресурсах.
  • Кириллица – вариант российской кодировки, используемый на русскоязычных сайтах и блогах.
  • КОИ8 (код обмена информацией 8-битный) – была разработана для кодирования букв кириллических алфавитов. Распространена в Unix-подобных ОС и электронной почте. Постепенно исчезает в связи с приходом Юникода.
  • Windows 1250-1258 – 8-битные кодировки, зародившиеся после появления операционной системы Windows. Например, 1250 – все языки центральной Европы, 1251 – кириллица. В ней присутствуют все буквы русского алфавита, а также символы (за исключением знака ударения).
  • UTF-8 – наиболее используемый тип кодировок, работающий практически со всеми языками мира. Символы занимают от 1 до 4 байт, что дает возможность создавать мультиязычные веб-сайты. Помимо UTF-8, есть такие варианты, как UTF-16 и UTF-32, однако предпочтение отдается первому типу.

Существуют и другие типы кодировок, но они используются в меньшей степени либо не используются вообще.

Автоматическое распознавание кодировокПравить

Во многих современных текстовых редакторах и браузерах присутствует функция автоматического распознавания кодировок, но она не всегда выдает верный результат. Иногда бывает, что текст, набранный например в командной строке или некоторых программах, неверно декодируется, и вместо нормальных слов получается набор непонятных символов. Справиться с прочтением такого текста может помочь большое количество декодеров текста, которые работают онлайн.

Альтернативная точка зрения считает подобные эвристические алгоритмы определения кодировки текста вредными, поскольку современные информационные технологии располагают средствами недвусмысленно сопоставить тексту положенную ему кодовую страницу (см., например, MIME). Широкое же распространение эвристических анализаторов поощряет использование некачественных программ создания текстовых данных, нарушающих стандарты.

1. При использовании сервера Apache можно использовать файл .htaccess. В нём нужно указать директивы серверу касательно кодировок по умолчанию:
AddDefaultCharset UTF-8
В приведенном примере кодировкой по умолчанию в заголовках сервера будет назначена UTF-8.

В случае кодировки windows-1251:
AddDefaultCharset windows-1251

Данные директивы файла .htaccess наиболее часто применимы. Но в каждом отдельно взятом случае могут и не сработать. Все зависит от настроек сервера.

Есть менее популярные директивы, действие которых направлено на отключение заголовков сервера. При их отключении браузер будет выбирать кодировку в зависимости от указаний в теге МЕТА.

Зачастую, проблемы отображения кодировок связаны с тем, что устаревшее ПО для Web (например, сайт, CMS и т. д.) использует национальную кодировку в то время как сервер настроен для работы с UTF-8. В этом случае, принудительно указывается язык, кодировка необходимая ПО (например, cp1251) для web-сервера, и (как правило) интерпретатора PHP.

php_value default_charset «cp1251»

  • Перечень основных «кодировок» в руководстве по Java SE 6. Дата обращения: 27 сентября 2008. Архивировано 16 декабря 2008 года.
  • Обсуждение темы «кодировок» в документации по языку Perl. Дата обращения: 27 сентября 2008. Архивировано 6 октября 2008 года.
  • Обсуждение темы «кодировок» в документации по технологии XSLT. Дата обращения: 5 октября 2008. Архивировано 13 августа 2017 года.
  • Обсуждение соотношения терминов «кодировка» и «набор символов» в документации по языку HTML. Дата обращения: 11 октября 2008. Архивировано 26 октября 2008 года.
  • Спецификации наборов символов на сайте IANA. Дата обращения: 27 сентября 2008. Архивировано 16 июля 2004 года.
  • Универсальный декодер — конвертер кириллицы. Дата обращения: 4 декабря 2014. Архивировано 28 декабря 2014 года.

Дополнительное видео по теме

Кодировка ASCII является американской и разрабатывалась для английского языка. Так как, к примеру, французский язык имеет надстрочные знаки, а русский алфавит не похож на английский, был разработан стандарт Unicode для расширения кодировки ASCII. Но и в Unicode, со временем, стало не хватать места для размещения новых символов. Поэтому на основе Unicode создали кодировку UTF-8, которая исправила эти недостатки. UTF-8 позволяет кодировать до 2 миллиардов символов, поэтому она доминирует в интернете.

В UTF-8 коды от 0 до 127 используются для представления символов ASCII. Если символ не входит в набор ASCII, то старший бит первого байта устанавливается в 1, что свидетельствует о дополнительном использовании байтов. То есть если в документе используются только символы из ASCII, то каждый символ в UTF-8 будет кодироваться восьмью битами.

Маркер UTF-8Править

Для указания, что файл или поток содержит символы Юникода, в начале файла или потока может быть вставлен маркер последовательности байтов (англ. Byte order mark, BOM), который в случае кодирования в UTF-8 принимает форму трёх байтов: EF BB BF16.

Кодировки и веб-страницы

Возвращаясь к избитой проблеме с кодировками русских букв, хотелось бы иметь под рукой некий единый справочник или руководство, в котором можно найти решения различных сходных ситуаций. В своё время сам перелопатил множество статей и публикаций, чтобы находить причины ошибок. Задача этой публикации — сэкономить время и нервы читателя и собрать воедино различные причины ошибок с кодировками в разработке на Java и JSP и способы их устранения.

Варианты решения могут быть не единственными, охотно добавлю предложенные читателем, если они будут рабочими.

Итак, поехали.

1. Проблема: при получении разработанной мной страницы браузером весь русский текст идёт краказябрами, даже тот, который забит статически.
Причина: браузер неверно определяет кодировку текста, потому что нет явного указания.
Решение: явно указать кодировку:
a) HTML: добавляем тэг META в хидер страницы:

б) XML: указываем кодировку в заголовке:

в) JSP — задаём тип контента в заголовке:

г) JSP — задаём кодировку возвращаемой страницы

д) Java — устанавливаем хидер ответа:

2. Проблема: написанный в JSP-странице статический русский текст почему-то идёт краказабрами, хотя кодировка страницы задана.
Причина: статический текст был написан в кодировке, отличной от заданного странице.
Решение: изменить кодировку в редакторе (например, для AkelPad нажимаем «Сохранить как» и выбираем нужную кодировку).

3. Проблема: получаемый из запроса текст идёт кракозябрами.
Причина: кодировка запроса отличается от используемой для его обработки кодировки.
Решение: установить кодировку запроса или перекодировать в нужную.
а) Java, со стороны отправителя не задана нужная кодировка — перекодируем в нужную:

Читайте также:  Hyper Server, Почтовый сервер, 1С-сервер, Локальные сети - решения для бизнеса на хостинге Timeweb

Примечание: кодировка ISO-8859-1 устанавливается по умолчанию, если не была задана другая.
б) Java, со стороны отправителя задана нужная кодировка — устанавливаем кодировку запроса:

4. Проблема: отправленный GET-параметром русский текст при редиректе приходит кракозябрами.
Причина: упаковка русского текста в URI по умолчанию идёт в ISO-8859-1.
Решение: упаковать текст в нужной кодировке вручную.
а) JSP, URLEncoder:

5. Проблема: текст из базы данных читается кракозябрами.
Причина: кодировка текста, прочитанного из базы данных, отличается от кодировки страницы.
Решение: установить соответствующую кодировку страницы, либо перекодировать полученные из базы данных значения.
а) Java, перекодирование считанной в db_string базы данных строки:

6. Проблема: текст записывается в базу данных кракозябрами, хотя на странице отображается правильно.
Причина: кодировка записываемой строки отличается от кодировки сессии работы с базой данных, либо от кодировки базы данных (стоит помнить, что они не всегда совпадают).
Решение: установить необходимую кодировку сессии или перекодировать строку.
а) Java, перекодирование записываемой строки db_string в кодировку сессии или базы данных:

б) Java, MySQL, настройка параметров подключения в строке dburl, передаваемой функции коннекта:

г) MySQL, прямая установка кодировки сессии вызовом SET NAMES (connect — объект подключения Connection):

Дополнение, или что нужно знать:

1. Кодировки базы данных и сессии подключения могут различаться, в зависимости от конкретной СУБД и драйвера. К примеру, при подключении к MySQL стандартным драйвером com.mysql.jdbc.Driver без явного указания кодировка сессии устанавливалась в UTF-8, несмотря на другую кодировку схемы БД.
2. Кодировка упаковки строки запроса в URI по умолчанию устанавливается в ISO-8859-1. С подобным можно столкнуться, например, при передаче явно заданного текста в редиректе с одной страницы на другую.
3. Взаимоотношения кодировок страницы, базы данных, сессии, параметров запроса и ответа не зависят от языка разработки и описанные для Java функции имеют аналоги для PHP, Asp и других.

Примечание: восстановить ссылки на источники нет возможности, все примеры взяты из собственного кода, хотя когда-то так же выискивал их по многочисленным форумам.

Надеюсь, этот небольшой обзор поможет начинающим веб-программистам сократить время отладки и сберечь нервы.

Определение кодировки средствами HTTPПравить

При отображении HTML-страницы браузерами последним нужно сообщить в какой кодировке сохранена страница. Для этого можно воспользоваться двумя методами:

При передаче документа HTML по HTTP (скажем, в WWW) набор символов документа задаётся в заголовке HTTP, например для текста в русском варианте кодировки КОИ-8:

Content-Type: text/html; charset=koi8-r

В стандарте для языка HTML 5 мета тег информирующий браузер о кодировке страницы записывается отлично от правил принятых в более ранних стандартах HTML. Так пример приведенный выше в HTML 5 будет выглядеть следующим образом:

Такой способ неплохо работает для файлов, но при выдаче документа по HTTP его успешность будет зависеть от действий HTTP-сервера, пожелает ли он указать эту информацию в заголовке. Согласно HTTP/1.1, отсутствие указания charset в заголовке приравнивается к использованию набора символов ISO 8859-1.

То есть, приоритетным фактором для браузера по вопросу «в какой кодировке отображать документ» может являться переданный сервером заголовок. В этом случае браузер обязан игнорировать соответственные директивы в теге META.

Набор символов

Текущая версия страницы пока не проверялась опытными участниками и может значительно отличаться от версии, проверенной 15 мая 2017 года; проверки требуют 20 правок.

Не следует путать с таблицей символов — списком используемых идентификаторов, составляемым при трансляции программы.

Проблема в том, что у нас не проводится различие между терминами character и symbol. По идее первое — это все же литера, а второе — понятно, символ.

Набо́р си́мволов (англ. ) — таблица, задающая кодировку конечного множества символов алфавита (обычно элементов

текста: букв, цифр, знаков препинания). Такая таблица сопоставляет каждому символу последовательность длиной в один или несколько символов другого алфавита (точек и тире в коде Mорзе, сигнальных флагов на флоте, нулей и единиц (битов) в компьютере).

Где и как изменить кодировку

В противном случае нам потребуется отредактировать файл .htaccess. Рассмотрим на примере хостинга Timeweb, как это можно сделать.

  • Открываем личный кабинет и переходим в раздел «Файловый менеджер». В нем перемещаемся в директорию с сайтом и находим в корне файл .htaccess – открываем его двойным кликом мыши.
  • В начало файла необходимо добавить следующий код:

Для UTF-8: AddDefaultCharset UTF-8

Для Windows-1251: AddDefaultCharset WINDOWS-1251

Открываем свой сайт и видим, что ничего не изменилось – так и должно быть. Чтобы внести изменения, очищаем кэш с помощью комбинации клавиш «CTRL+F5» и смотрим результат.

Как видите, сменить кодировку на своем сайте легко. Аналогичным образом мы можем изменить кодировку и на всем сервере – для этого необходимо выполнить следующее (актуально для веб-сервера Apache):

  • Находим файл httpd.conf, который расположен по адресу: «/usr/local/apache/conf/», и открываем его.
  • Если нужно поменять Windows-1251 на UTF-8, то меняем строку «AddDefaultCharset windows-1251» на «AddDefaultCharset utf-8».

Если вы поменяете кодировку по умолчанию, то она будет изменена для всех ресурсов, находящихся на данном сервере.

Алгоритм кодированияПравить

Алгоритм кодирования в UTF-8 стандартизирован в RFC 3629 и состоит из 3 этапов:

1. Определить количество октетов (байтов), требуемых для кодирования символа. Номер символа берётся из стандарта Юникода.

Для символов Юникода с номерами от U+0000 до U+007F (занимающими один байт c нулём в старшем бите) кодировка UTF-8 полностью соответствует 7-битной кодировке US-ASCII.

2. Установить старшие биты первого октета в соответствии с необходимым количеством октетов, определённом на первом этапе:

  • 0xxxxxxx — если для кодирования потребуется один октет;
  • 110xxxxx — если для кодирования потребуется два октета;
  • 1110xxxx — если для кодирования потребуется три октета;
  • 11110xxx — если для кодирования потребуется четыре октета.

Если для кодирования требуется больше одного октета, то в октетах 2-4 два старших бита всегда устанавливаются равными 102 (10xxxxxx). Это позволяет легко отличать первый октет в потоке, потому что его старшие биты никогда не равны 102.

3. Установить значащие биты октетов в соответствии с номером символа Юникода, выраженном в двоичном виде. Начать заполнение с младших битов номера символа, поставив их в младшие биты последнего октета, продолжить справа налево до первого октета. Свободные биты первого октета, оставшиеся незадействованными, заполнить нулями.

Набор символов в компьютереПравить

Символы в компьютере обычно кодируются одним или нескольким байтами (группами из восьми битов).

Нередко также вместо термина «набор символов» неправильно употребляют термин «кодовая страница», означающий на самом деле частный случай набора символов с однобайтным кодированием.

Современные 8-битные вычислительные платформы характеризуются небольшими объёмами ОЗУ и ПЗУ; многобайтные кодировки в таких изделиях значительного распространения не получили. Причиной тому не только больший объём, занимаемый текстовыми данными, представленными в многобайтной кодировке, но и отсутствие «лишней» памяти для хранения графического представления дополнительных символов, а также трудность обработки таких строк. В настоящее время часто используются следующие стандартные однобайтные кодировки:

Возможные ошибки декодированияПравить

Не всякая последовательность байтов является допустимой. Декодер UTF-8 должен понимать и адекватно обрабатывать такие ошибки:

  • Недопустимый байт.
  • Байт продолжения (10xxxxxx) без начального байта.
  • Отсутствие нужного количества байтов продолжения 10xxxxxx — например, двух после 1110xxxx).
  • Строка обрывается посреди символа.
  • Неэкономное кодирование — например, кодирование символа тремя байтами, когда можно двумя. (Существует нестандартный вариант UTF-8, который кодирует символ с кодом 0 как 1100.0000 1000.0000, отличая его от символа конца строки 0000.0000.)
  • Последовательность байтов, декодирующаяся в недопустимую кодовую позицию (например символы суррогатных пар UTF-16).

Как узнать кодировку сайта

Иногда для устранения проблемы на сайте возникает необходимость определить кодировку открытой страницы. Сделать это можно несколькими способами:

По метатегу

  • Откройте исходный код страницы. Обычно это реализуется нажатием правой кнопки мыши по пустому месту открытого окна и выбором пункта меню «Исходный код страницы».
  • В области найдите тег
  • В нем должна быть строка с параметром charset.
  • Значение этого параметра обозначает кодировку открытого сайта.

Через инструментарий браузера

  • Найдите в вашем обозревателе меню с выбором «Информация о странице» или «Подробнее», пункт зависит от используемой программы.
  • Выберите вкладку с основной информацией в открывшемся окне.
  • Одним из свойств страницы будет «Кодировка текста».

Как лучше кодировать сайт? Какие проблемы с кодировкой на сайте

Определение кодировки средствами XMLПравить

В XHTML можно также указывать кодировку в преамбуле XML, например:

Проблемы с кодировкой на сайте

Проблемы с кодировкой, когда на сайте отображаются нечитаемые символы вместо корректного содержимого, возникают из-за несовпадения кодировки файлов сайта с кодировкой, которая устанавливается настройками сервера или базы данных.

Ниже рассмотрим возможные способы устранения этих проблем.

Оцените статью
Хостинги