Учебник PHP



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

mbstring это модуль расширения. Вы обязаны подключить его скриптом configure. См. детали в разделе Инсталяция.

Следующие опции конфигурации имеют отношение к модулю mbstring:

  • --enable-mbstring : включает функции mbstring. Эта опция нужна для использования mbstring-функций.

  • --enable-mbstr-enc-trans : включает конвертацию кодировки символов HTTP-ввода с использованием mbstring-машины конвертации. Если эта возможность включена, кодировка символов HTTP-ввода может быть автоматически конвертирована в mbstring.internal_encoding.

HTTP ввод и вывод

Конвертация кодировки символов 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. Обратитесь к разделу Конфигурация и учебнику 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:

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()

Примечание: "поддерживаемые кодировки символов" не означает, что это работает как внутренний код символа.

Установки php.ini

  • 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

Перегрузка/Overload строковых функций PHP mbstring-функциями с поддержкой многобайтных символов

Поскольку большинство приложений 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. Перегружаемые функции
значение mbstring.func_overload функция-оригиналперегруженная функция
1 mail()mb_send_mail()
2strlen() mb_strlen()
2 strpos()mb_strpos()
2strrpos() mb_strrpos()
2 substr()mb_substr()
4ereg() mb_ereg()
4 eregi()mb_eregi()
4ereg_replace() mb_ereg_replace()
4 eregi_replace()mb_eregi_replace()
4split() mb_split()

Основы многобайтной японской кодировки символов

Большинство японских символов для своего представления требуют более одного байта на символ. Кроме того, в японском окружении используются разные схемы кодировки. Существуют кодировки 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.

Ссылки

Многобайтные кодировки и связанные с ними вопросы очень сложны. Невозможно рассмотреть их здесь достаточно подробно. Дополнительно просмотрите следующие ресурсы.

  • Unicode/UTF/UCS/etc

    http://www.unicode.org/

  • информация о символах Japanese/Korean/Chinese

    ftp://ftp.ora.com/pub/examples/nutshell/ujip/doc/cjk.inf

Содержание
mb_convert_encoding - конвертирует кодировку символов
mb_convert_kana - конвертирует "kana" из одной в другую ("zen-kaku" ,"han-kaku" и другие)
mb_convert_variables - конвертирует код символа в переменной(-ых)
mb_decode_mimeheader - декодирует строку в поле MIME header
mb_decode_numericentity - декодирует HTML-ссылку на числовую строку в символ
mb_detect_encoding - определяет кодировку символов
mb_detect_order - устанавливает/получает порядок определения кодировки символов
mb_encode_mimeheader - кодирует строку для MIME header'а
mb_encode_numericentity - кодирует символ в HTML-ссылку на числовую строку
mb_ereg_match - совпадение с регулярным выражением для многобайтной строки
mb_ereg_replace - замещает регулярное выражение многобайтной поддержкой
mb_ereg_search_getpos - возвращает стартовую точку следующего совпадения регулярного выражения
mb_ereg_search_getregs - запрашивает результат из последнего совпадения многобайтного регулярного выражения
mb_ereg_search_init - настраивает строку и регулярное выражение для совпадения с регулярным выражением
mb_ereg_search_pos - возвращает позицию и длину совпавшей части многобайтного регулярного выражения для предопределённой многобайтной строки
mb_ereg_search_regs - возвращает совпавшую часть многобайтного регулярного выражения
mb_ereg_search_setpos - устанавливает стартовую точку следующего совпадения регулярного выражения
mb_ereg_search - совпадение многобайтного регулярного выражения для предопределённой многобайтной строки
mb_ereg - совпадение с регулярным выражением, с многобайтной поддержкой
mb_eregi_replace - заменяет регулярное выражение с многобайтной поддержкой, игнорируя регистр
mb_eregi - совпадение с регулярным выражением, игнорируя регистр, с многобайтной поддержкой
mb_get_info - получает внутренние настройки mbstring
mb_http_input - определяет кодировку символов HTTP-ввода
mb_http_output - устанавливает/получает кодировку символов HTTP-вывода
mb_internal_encoding - устанавливает/получает внутреннюю кодировку кодировку символов
mb_language - устанавливает/получает текущий язык
mb_output_handler - Callback-функция конвертирует кодировку символов в буфере вывода
mb_parse_str - разбирает GET/POST/COOKIE данные и устанавливает глобальную переменную
mb_preferred_mime_name - получает строку MIME charset
mb_regex_encoding - возвращает текущую кодировку для многобайтного regex как строку
mb_send_mail - отправляет кодированную mail
mb_split - делит многобайтную строку с использованием регулярного выражения
mb_strcut - получает часть строки
mb_strimwidth - получает усечённую строку специфицированной ширины
mb_strlen - получает длину строки
mb_strpos - находит позицию первого вхождения строки в строке
mb_strrpos - находит позицию последнего вхождения строки в строке
mb_strwidth - возвращает ширину строки
mb_substitute_character - устанавливает/получает замещающий символ
mb_substr - получает часть строки

НазадОглавление Вперёд
tanhВверх mb_convert_encoding



Книжный магазин