Как проблемы кодирования решаются в сети

В течение 1 года я разрабатывал веб-приложения, в которых используется среда (apache, php, html5 и javascript). До этого времени я не заботился о проблемах кодирования. Это было похоже на магию. Я просто установил соединение mysql в файле конфигурации для UTF-8 и забудь.
Но после того, как мой опыт вырос, я столкнулся со случаями, когда мне нужно было полностью понять, как проблемы кодирования решаются в этой среде. Когда я что-то получаю, я скучаю по остальным. Так что я не мог получить полную картину.
Чтобы было ясно:

  • Строки Javascript являются UTF-16
  • Транспортная кодировка HTTP является произвольной.
  • Строки PHP являются двоичными.
  • Mysql соединение также является произвольным.

Как происходит преобразование и какие возможные проблемы мне нужны.

2 ответа

Решение

Проблема действительно существует только на границе между двумя системами. Внутри одной системы (PHP, база данных, Javascript и т. Д. По отдельности) есть четкие способы работы с кодировками, и, как правило, здесь есть небольшие трения. Проблема, как правило, заключается в том, что двоичные данные передаются из одной системы в другую, скажем, PHP в базу данных, без правильного указания в сопроводительных метаданных, в какой кодировке находится этот двоичный объект.

Разные интерфейсы между системами имеют разные способы указания необходимых метаданных. Интерфейс между PHP и базой данных позволяет указать кодировку соединения, которая позволяет базе данных "понять", какую кодировку использует PHP и какую кодировку она ожидает взамен. Между веб-сервером / PHP и браузером есть заголовки HTTP и / или метатеги HTML, которые позволяют указывать эти метаданные.

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

  • между PHP и большинством баз данных, PHP определяет используемую кодировку, а база данных на лету преобразует текст в эту кодировку
  • между веб-серверами / PHP и браузерами сервер / PHP объявляет, в какой кодировке находится содержимое, которое он отправляет, и браузер должен с ним справиться
  • сервер также объявляет, какую кодировку он ожидает, если браузер отправляет какие-либо данные через accept-charset атрибут форм, или браузер выводит его из полученного контента
  • Javascript получает текст после того, как браузер с ним справился, поэтому он не заботится о кодировках

Они не произвольные, они то, что вы им говорите. Так что в общем можно сделать все UTF-8, и у вас все хорошо.

Внутренние строки Javascript - только UTF-16. Файлы JS, которые вы отправляете, могут быть в формате UTF-8. Если вы сообщите браузеру, какая кодировка имеет ответ, браузер сможет преобразовать его в любую нужную кодировку. Проблема начинается только тогда, когда вы указываете другую кодировку, чем вы фактически отправляете.

Почему UTF-8?

  • Каждая кодировка ANSI имеет проблемы с указанием всех символов (есть место только для 256 различных символов).
  • UTF-8, как правило, является наиболее компактным форматом Unicode, особенно при транспортировке западных языков.
  • UTF-8 является единственной кодировкой Unicode, на которую не влияют различия в метках порядка байтов между Linux и Windows, хотя вам также не о чем беспокоиться.

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

Другие вопросы по тегам