Кодировка символов и проблема - PullRequest
3 голосов
/ 07 декабря 2011

Даже сегодня часто возникают проблемы с кодировкой символов со значительной частотой. Возьмем, к примеру, эту недавнюю работу:

Bad Encoding

( Примечание : это пример, а не сообщение о спаме ...: -)

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

Мой вопрос из двух частей:

  • Что вызывает эту частую проблему кодирования?
  • Как разработчику, что я должен делать с пользовательским вводом, чтобы избежать распространенных проблем кодирования, таких как этот? Если этот вопрос требует упрощения, чтобы обеспечить значимый ответ, предположим, что контент вводится через веб-браузер.

1 Ответ

4 голосов
/ 07 декабря 2011

Что является причиной этой частой проблемы кодирования?

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

В конкретном примере ’ это типичное представление CP1252 символа Unicode 'RIGHT SINQLE QUOTATION MARK' (U + 2019) , который был прочитан с использованием UTF-8.В UTF-8 этот символ существует из байтов 0xE2, 0x80 и 0x99.Если вы проверите макет кодовой страницы CP1252 , то увидите, что эти байты точно соответствуют символам â, и .

Это может быть вызвановеб-сайт не прочитал должным образом исходный код (для этого он должен был использовать CP1252) или отображает страницу UTF-8 с неверным атрибутом charset=CP1252 в заголовке ответа Content-Type (или атрибут отсутствует; на машинах Windowsтогда будет использоваться кодировка по умолчанию CP1252).


Как разработчику, что я должен делать с пользовательским вводом, чтобы избежать распространенных проблем с кодировкой, подобных этой?Если этот вопрос требует упрощения для обеспечения значимого ответа, предположим, что контент вводится через веб-браузер.

Убедитесь, что вы читаете символы из произвольных источников потока байтов (например, файла, URL-адреса).сетевой сокет и т. д.) с использованием известной и заранее определенной кодировки.Затем убедитесь, что вы постоянно сохраняете, записываете и отправляете его, используя кодировку Unicode, предпочтительно UTF-8.

Если вы знакомы с Java (история ваших вопросов подтверждает это), вы можете найти эта статья полезна.

...