 |
LIII. Функции мультибайтных строк
Во многих языках символы могут выражаться
одним байтом. Многобайтные коды символов используются для выражения символов многих
других языков. 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;;
Отключить конвертацию HTTP Input mbstring.http_input = pass |
|
При
использовании PHP как Apache-модуля можно переопределять PHP ini-установку на
уровне Virtual Host в httpd.conf или на уровне директории в .htaccess.
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: UCS-4, UCS-4BE,
UCS-4LE, UCS-2, UCS-2BE, UCS-2LE, UTF-32,
UTF-32BE, UTF-32LE, UCS-2LE, UTF-16, UTF-16BE,
UTF-16LE, UTF-8, UTF-7, ASCII, EUC-JP,
SJIS, eucJP-win, SJIS-win, ISO-2022-JP, JIS,
ISO-8859-1, ISO-8859-2, ISO-8859-3, ISO-8859-4,
ISO-8859-5, ISO-8859-6, ISO-8859-7, ISO-8859-8,
ISO-8859-9, ISO-8859-10, ISO-8859-13, ISO-8859-14,
ISO-8859-15, byte2be, byte2le, byte4be, byte4le,
BASE64, 7bit, 8bit и UTF7-IMAP. Вхождение
в php.ini, принимающее имя кодировки, принимает также "auto"
и "pass". mbstring функции, принимающие имя кодировки, принимают
и "auto". Если "pass" установлено, никакая конвертация
кодировки символов не выполняется. Если "auto" установлено, оно
расширяется до "ASCII,JIS,UTF-8,EUC-JP,SJIS". См. также mb_detect_order() Примечание:
"поддерживаемые кодировки символов" не означает, что это работает как внутренний
код символа.
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 функции должны перегружаться.
Список перегружаемых функций дан в таблице. Таблица
1. Перегружаемые функцииБольшинство японских символов для своего представления
требуют более одного байта на символ. Кроме того, в японском окружении используются
разные схемы кодировки. Существуют кодировки 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.
Многобайтные кодировки
и связанные с ними вопросы очень сложны. Невозможно рассмотреть их здесь достаточно
подробно. Дополнительно просмотрите следующие ресурсы. |  |