Что является причиной этой частой проблемы кодирования?
Это произойдет, если преобразование между символами и байтами было выполнено с использованием неправильной кодировки.Компьютеры обрабатывают данные как байты, но чтобы представить данные разумным образом для людей, они должны быть преобразованы в символы (строки).Это преобразование происходит на основе набора символов, в котором есть много разных.
В конкретном примере ’
это типичное представление 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 (история ваших вопросов подтверждает это), вы можете найти эта статья полезна.