Во многих языках символы могут выражаться одним байтом. Многобайтные коды
символов используются для выражения символов многих других языков. mbstring разработано для работы с японскими символами. Однако многие функции
mbstring могут работать с иными кодировками, не только с японской.
Многобайтная кодировка символов представляет один символ несколькими
последовательными байтами. Некоторые кодировки имеют shift(escape)-последовательности
для начала/окончания строк многобайтных символов. Следовательно, многобайтная
строка может быть разрушена при разделении и/или обсчёте, если не использовать
метод надёжного кодирования многобайтных символов. Данный модуль предоставляет
функции сохранения много байтных символов и другие вспомогательные функции, такие как функции конвертации.
Поскольку PHP в основе своей разработан для ISO-8859-1, некоторые
многобайтные кодировки плохо работают в PHP. Следовательно, важно
устанавливать mbstring.internal_encoding для кодировки, работающей с PHP.
Требования Кодировки Символов PHP4
побайтное кодирование
однобайтные символы находятся в диапазоне 00h-7fh,
что совместимо с ASCII
многобайтное кодирование - вне диапазона 00h-7fh
Вот примеры внутренней кодировки символов, которые работают и НЕ работают с PHP.
Работающие в PHP кодировки:
ISO-8859-*, EUC-JP, UTF-8. Кодировки, НЕ работающие в PHP:
JIS, SJIS
Кодировки символов, не работающие с PHP, могут быть конвертированы с
помощью функции конвертации HTTP-ввода/вывода модуля mbstring.
Примечание: SJIS не должна использоваться для внутреннего кодирования, если читатель
не знаком достаточно хорошо с вопросами работы разборщика/компилятора и кодирования символов.
Примечание: если вы используете БД с PHP, рекомендуется использовать одну кодировку
для БД и internal encoding/внутреннего кодирования для облегчения использования и повышения производительности.
Если вы используете PostgreSQL, он поддерживает кодировки символов,
которые отличаются от backend-кодировки. См. детали в учебнике PostgreSQL.
mbstring это модуль расширения. Вы обязаны подключить его скриптом
configure. См. детали в разделе Инсталяция.
Следующие опции конфигурации имеют отношение к модулю mbstring:
--enable-mbstring : включает функции mbstring. Эта опция нужна для использования
mbstring-функций.
--enable-mbstr-enc-trans : включает конвертацию кодировки символов HTTP-ввода с использованием
mbstring-машины конвертации. Если эта возможность включена, кодировка символов HTTP-ввода
может быть автоматически конвертирована в mbstring.internal_encoding.
Конвертация кодировки символов HTTP-ввода/вывода может конвертировать
также двоичные данные. Пользователям предлагается контролировать конвертацию
кодировки символов, если бинарные данные используются для ввода/вывода HTTP.
Если enctype для HTML-формы установлен multipart/form-data,
mbstring не конвертирует кодировку символов в POST-данных. Если это так, строки должны
конвертироваться во внутреннюю кодировку символов.
HTTP-ввод
Нет способов управлять конвертацией символов HTTP-ввода из PHP-скрипта.
Отключение конвертации символов HTTP-ввода нужно сделать в php.ini.
Пример 1. Отключение конвертации символов HTTP-ввода в php.ini
При использовании PHP как Apache-модуля можно переопределять PHP ini-установку на уровне Virtual Host в
httpd.conf или на уровне директории в .htaccess. Обратитесь к разделу Конфигурация и
учебнику Apache.
HTTP-вывод
Есть несколько способов включить конвертацию кодировки символов вывода.
Один - это использование php.ini, другой - функция ob_start() с
mb_output_handler() как ob_start callback-функция.
Примечание: Для пользователей PHP3-i18n: конвертация вывода mbstring отличается от PHP3-i18n. Кодировка символов конвертируется с использованием
буфера вывода.
Пример 2. Установки php.ini
;; Включить конвертацию кодировки символов для всех страниц PHP
;; Включить буферизацию вывода
output_buffering = On
;; Установить mb_output_handler для включения конвертации вывода
output_handler = mb_output_handler
Пример 3. Пример скрипта
<?php
// Включить конвертацию кодировки символов только для данной страницы
// Установить кодировку символов HTTP-вывода для SJIS
mb_http_output(’SJIS’);
// Начать буферизацию и специфицировать "mb_output_handler" как
// callback-функцию
ob_start(’mb_output_handler’);
?>
В настоящее время модуль mbstring поддерживает нижеследующие кодировки символов. Кодировка символов может быть
специфицирована параметром encoding функций модуля mbstring.
Вот кодировки, поддерживаемые данным расширением PHP:
mbstring.internal_encoding определяет внутреннюю кодировку символов по умолчанию
mbstring.http_input определяет кодировку символов по умолчанию HTTP-ввода
mbstring.http_output определяет кодировку символов по умолчанию HTTP-вывода
mbstring.detect_order определяет порядок определения кодировки символов по умолчанию. См. также
mb_detect_order()
mbstring.substitute_character определяет символы для замещения неправильных кодировок символов
Web-браузерам предлагается использовать ту же кодировку при отправку форм.
Однако браузеры могут не использовать ту же кодировку символов. См. mb_http_input() для определения кодировки браузера.
Если enctype имеет установленное значение multipart/form-data в HTML-формах,
mbstring не конвертирует кодировку символов в POST-данных. Пользователь обязан сделать
это в скрипте, если конвертация нужна.
Одновременно браузеры достаточно наворочены, чтобы определять кодировку символов в HTML. charset лучше установить в HTTP-шапке/header. Измените
default_charset в соответствии с кодировкой символов.
Пример 4. Установки php.ini
;; Установить внутреннюю кодировку по умолчанию
;; Примечание: Используйте кодировку символов, которая работает с PHP
mbstring.internal_encoding = UTF-8 ; Установить внутреннюю кодировку UTF-8
;; Установить кодировку символов по умолчанию для HTTP-ввода
;; Примечание: Скрипт не может изменить установку http_input
mbstring.http_input = pass ; Нет конвертации
mbstring.http_input = auto ; Установить HTTP-ввод в auto
; "auto" расширяется до "ASCII,JIS,UTF-8,EUC-JP,SJIS"
mbstring.http_input = SJIS ; Установить HTTP2-ввод в SJIS
mbstring.http_input = UTF-8,SJIS,EUC-JP ; Специфицировать порядок
;; Установить кодировку символов по умолчанию для HTTP-вывода
mbstring.http_output = pass ; Нет конвертации
mbstring.http_output = UTF-8 ; Установить кодировку HTTP-вывода в UTF-8
;; Установить порядок определения кодировки символов по умолчанию
mbstring.detect_order = auto ; Установить порядок определения в auto
mbstring.detect_order = ASCII,JIS,UTF-8,SJIS,EUC-JP ; Специфицировать порядок
;; Установить замещающий символ по умолчанию
mbstring.substitute_character = 12307 ; Специфицировать значение Unicode
mbstring.substitute_character = none ; Не печатать символ
mbstring.substitute_character = long ; Long-Пример: U+3000,JIS+7E7E
Пример 5. Установки php.ini для пользователей
EUC-JP
;; Отключить буферизацию вывода
output_buffering = Off
;; Установить HTTP header набора символов
default_charset = EUC-JP
;; Установить конвертацию кодировки HTTP-ввода в auto
mbstring.http_input = auto
;; Конвертировать HTTP-вывод в EUC-JP
mbstring.http_output = EUC-JP
;; Установить внутреннюю кодировку EUC-JP
mbstring.internal_encoding = EUC-JP
;; Не печатать неправильные символы
mbstring.substitute_character = none
Пример 6. Установки php.ini для пользователей SJIS
;; Включить буферизацию вывода
output_buffering = On
;; Установить mb_output_handler для включения конвертации вывода
output_handler = mb_output_handler
;; Установить HTTP header набора символов
default_charset = Shift_JIS
;; Установить конвертацию кодировки http-ввода в auto
mbstring.http_input = auto
;; Конвертировать в SJIS
mbstring.http_output = SJIS
;; Установить внутреннюю кодировку EUC-JP
mbstring.internal_encoding = EUC-JP
;; Не печатать неправильные символы
mbstring.substitute_character = none
Поскольку большинство приложений PHP написаны на языках, использующих
однобайтную кодировку символов, имеются некоторые трудности при работе с
многобайтными строками, в том числе с японскими. Большинство строковых PHP-функций,
таких как substr(), не поддерживают многобайтные строки.
Многобайтное расширение (mbstring) имеет строковые РНР-функции с
поддержкой многобайтных символов (например, substr() поддерживает
mb_substr()).
Многобайтное расширение (mbstring) также поддерживает ’перегрузку функций’
для добавления функциональности многобайтных строк без модификации кода.
Используя перегрузку функций, некоторые строковые функции PHP будут перегружены многобайтными строковыми функциями.
Например, mb_substr() вызывается вместо
substr(), если перегрузка функций включена. Перегрузка функций облегчает перенос
приложений, поддерживая только однобайтные кодировки для многобайтных приложений.
mbstring.func_overload в php.ini должно иметь некоторое положительное значение для использования перегрузки функций.
Это значение должно специфицировать категорию перегружающей функции: 1
включает перегрузку функции mail; 2 - строковые функции, 4 - функции
регулярных выражений. Например, если установлена 7, mail, strings и regex
функции должны перегружаться. Список перегружаемых функций дан в таблице.
Большинство японских символов для своего представления требуют более
одного байта на символ. Кроме того, в японском окружении используются разные
схемы кодировки. Существуют кодировки EUC-JP, Shift_JIS(SJIS) и
ISO-2022-JP(JIS). По мере приобретения популярности Unicode начинает
использоваться также UTF-8. при разработке Web-приложений для японской среды
важно использовать набор символов, соответствующих текущей задаче - HTTP ввод/вывод, RDBMS и E-mail.
Для хранения символа можно использовать до 6 байтов.
Многобайтный символ обычно в два раза шире однобайтного. Более широкие символы называются
"zen-kaku" - что означает "полная ширина", более узкие называются "han-kaku" -
что означает "половина ширины". "zen-kaku" имеют обычно фиксированную ширину.
Некоторые кодировки определяют shift(escape)-последовательность для входа/выхода в/из многобайтных строк.
ISO-2022-JP обязан использоваться для SMTP/NNTP.
"i-mode" web-сайт предполагается использовать с SJIS.
Многобайтные кодировки и связанные с ними вопросы очень сложны.
Невозможно рассмотреть их здесь достаточно подробно. Дополнительно просмотрите следующие ресурсы.