Проблема китайской кодировки в программировании на PHP беспокоит многих людей. Причина этой проблемы на самом деле очень проста. В каждой стране (или регионе) предусмотрен набор кодировок символов для обмена компьютерной информацией, например расширенный код ASCII в США и США. GB2312 в Китае -80, японский JIS и т. д. В качестве основы для обработки информации в этой стране/регионе наборы кодировок символов играют важную роль в унификации кодирования. Наборы кодировок символов делятся на две категории в зависимости от длины: SBCS (однобайтовый набор символов) и DBCS (двухбайтовый набор символов). В ранних версиях программного обеспечения (особенно в операционных системах) для решения компьютерной обработки локальной символьной информации появлялись различные локализованные версии (L10N). Для дифференциации были введены такие понятия, как LANG и Codepage. Однако из-за перекрытия диапазонов кодов различных локальных наборов символов сложно обмениваться информацией друг с другом, стоимость независимого обслуживания каждой локализованной версии программного обеспечения высока; Поэтому необходимо извлекать общие черты в работе по локализации и последовательно их обрабатывать, чтобы свести к минимуму специальный объем обработки локализации. Это также называется интернационализацией (118N). Различная языковая информация дополнительно стандартизируется как информация о локали. Базовым обработанным набором символов стал Unicode, который содержит почти все глифы.
В настоящее время основная обработка символов программного обеспечения с международными характеристиками основана на Unicode. Когда программное обеспечение работает, соответствующие настройки локальной кодировки символов определяются в соответствии с настройками локали/языка/кодовой страницы на данный момент, а местные символы определяются. обрабатывается соответствующим образом. Во время обработки необходимо реализовать взаимное преобразование между Unicode и локальными наборами символов или даже взаимное преобразование между двумя разными локальными наборами символов с Unicode в середине. Этот метод дополнительно расширяется в сетевой среде, и любую символьную информацию на обоих концах сети также необходимо преобразовать в приемлемый контент в соответствии с настройками набора символов.
Проблемы с кодировкой набора символов в базах данных
Все популярные системы реляционных баз данных поддерживают кодировку набора символов базы данных. Это означает, что при создании базы данных вы можете указать свои собственные настройки набора символов, и данные базы данных будут храниться в указанной кодировке. Когда приложение обращается к данным, происходит преобразование кодировки набора символов как в точках входа, так и в точках выхода. Для китайских данных настройка кодировки символов базы данных должна обеспечивать целостность данных. GB2312, GBK, UTF-8 и т. д. — все это дополнительные кодировки набора символов базы данных; конечно, мы также можем выбрать ISO8859-1 (8-бит), но перед
применением
нам необходимо преобразовать 16-битный китайский символ или Unicode; записывает данные.Разделяется на два 8-битных символа. После чтения данных необходимо объединить два байта и идентифицировать символы SBCS. Поэтому мы не рекомендуем использовать ISO8859-1 в качестве кодировки набора символов базы данных. Это не только не позволяет в полной мере использовать поддержку кодировки набора символов самой базы данных, но также увеличивает сложность программирования. При программировании вы можете сначала использовать функции управления, предоставляемые системой управления базой данных, чтобы проверить правильность китайских данных.
Перед запросом к базе данных программа PHP сначала выполняет mysql_query("SET NAMES xxxx"); где xxxx — кодировка вашей веб-страницы (charset=xxxx). Если на веб-странице charset=utf8, то xxxx=utf8, если charset. =gb2312 на веб-странице, затем xxxx=gb2312, почти все веб-программы имеют общий код для подключения к базе данных, который помещается в файл. В этом файле просто добавьте mysql_query("SET NAMES xxxx").
SET NAMES показывает, какой набор символов используется в операторе SQL, отправленном клиентом. Таким образом, оператор SET NAMES 'utf-8' сообщает серверу, что «будущая информация от этого клиента будет использовать набор символов utf-8». Он также определяет набор символов для результатов, которые сервер отправляет обратно клиенту (например, если вы используете оператор SELECT, он указывает, какой набор символов используется для значений столбца).
Обычно используемые методы обнаружения проблем при обнаружении проблем
с китайской кодировкой обычно используют самый глупый и эффективный метод - печать внутреннего кода строки после обработки программой, которую вы считаете подозрительной. Распечатав внутренний код строки, вы можете узнать, когда китайские символы преобразуются в Юникод, когда Юникод преобразуется обратно во внутренний китайский код, когда один китайский символ становится двумя символами Юникода, когда китайская строка преобразуется в строку из вопросительные знаки, когда были усечены старшие биты строки китайских символов...
Взятие подходящей выборки строки также может помочь различить тип вопроса. Например: « aaahaa?@aa » и другие строки, которые чередуются на китайском и английском языках и содержат характерные символы GB и GBK. Вообще говоря, английские символы не будут искажаться, как бы они ни конвертировались и не обрабатывались (если вы с ними столкнулись, то можете попробовать увеличить длину последовательных английских букв).
Устранение проблем с искаженным кодом в различных приложениях
. 1) Используйте теги для установки кодировки страницы.
Функция этого тега — указать, какую кодировку набора символов использует браузер клиента для отображения страницы. xxx может быть GB2312, GBK, UTF-8 (отличается от). MySQL (UTF8) и так далее. Таким образом, большинство страниц могут использовать этот метод, чтобы сообщить браузеру, какую кодировку использовать при отображении этой страницы, чтобы избежать ошибок кодирования и искажения символов. Но иногда мы обнаруживаем, что это предложение по-прежнему не работает. Независимо от того, какой именно xxx, браузер всегда использует одну и ту же кодировку. Об этой ситуации я расскажу позже.
Обратите внимание, что он принадлежит информации HTML и представляет собой просто оператор, который указывает только на то, что сервер передал информацию HTML браузеру.
2) header("content-type:text/html; charset=xxx");
Функция этой функции header() — отправить информацию в скобках в http-заголовок. Если содержимое в скобках такое, как указано в статье, то функция по сути такая же, как и метка. Если вы сравните ее с первой, вы обнаружите, что символы похожи. Но разница в том, что при наличии этой функции браузер всегда будет использовать запрошенную вами кодировку xxx и никогда не будет непослушным, поэтому эта функция очень полезна. Почему это происходит? Тогда нам нужно поговорить о разнице между http-заголовком и HTML-информацией:
http-заголовок — это строка, отправляемая сервером перед отправкой HTML-информации в браузер по протоколу http. Тег принадлежит HTML-информации, поэтому контент, отправленный с помощью header(), первым достигает браузера. Популярным моментом является то, что header() имеет более высокий приоритет (я не знаю, могу ли я так сказать). Если страница php имеет как заголовок («content-type:text/html;charset=xxx»), так и заголовок («content-type:text/html;charset=xxx»), браузер распознает только прежний заголовок http и не мета. Конечно, эту функцию можно использовать только на страницах PHP.
Остается еще вопрос, почему первое точно работает, а второе иногда не работает. Именно по этой причине дальше мы поговорим об Apache.
3) AddDefaultCharset
В папке conf корневого каталога Apache находится весь документ конфигурации Apache httpd.conf.
Откройте httpd.conf с помощью текстового редактора. Строка 708 (может отличаться в разных версиях) содержит AddDefaultCharset xxx, где xxx — имя кодировки. Смысл этой строки кода: установите набор символов в заголовке http файла веб-страницы на всем сервере в набор символов xxx по умолчанию. Наличие этой строки эквивалентно добавлению заголовка («тип содержимого: text/html; charset=xxx») к каждому файлу. Теперь вы можете понять, почему браузер всегда использует gb2312, хотя для него установлено значение utf-8.
Если на веб-странице есть заголовок («content-type:text/html; charset=xxx»), набор символов по умолчанию будет изменен на установленный вами набор символов, поэтому эта функция всегда будет полезна. Если вы добавите «#» перед AddDefaultCharset xxx, закомментируете это предложение и страница не будет содержать заголовок («content-type...»), тогда наступит очередь мета-тега вступить в силу.
Порядок приоритета приведен выше:
.. header("content-type:text/html; charset=xxx")
.. AddDefaultCharset xxx
..
Если вы веб-программист, рекомендуется добавлять заголовок к каждому ваших страниц («content-type:text/html;charset=xxx»), это гарантирует правильное отображение на любом сервере и хорошую переносимость.
4) Конфигурация Default_charset в php.ini:
default_charset = «gb2312» в php.ini определяет набор языковых символов php по умолчанию. Обычно рекомендуется закомментировать эту строку и позволить браузеру автоматически выбирать язык на основе кодировки в заголовке веб-страницы вместо обязательного требования, чтобы веб-сервисы на нескольких языках могли предоставляться на одном сервере.
Заключение
На самом деле, китайское кодирование при разработке PHP не так сложно, как можно себе представить. Хотя не существует фиксированных правил позиционирования и решения проблем, а различные операционные среды также различаются, основные принципы одинаковы. Понимание знания наборов символов является основой для решения проблем с символами. Однако с изменениями в наборе китайских символов не только PHP-программирование, но и проблемы с обработкой китайской информации еще некоторое время будут существовать.