Учебник РНР (перевод Alexandr Pyramidin) Размещено на PHPClub.Net
Назад Вперёд

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

    https://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