Строковые функции PHP Multibyte (mb_string)

В то время как есть много языков, в которых каждый необходимый символ может быть представлен взаимно-однозначным отображением к значению на 8 битов, есть также несколько языков, которые требуют ,большего числа символов для письменной связи, которая не может содержаться в пределах одного байта. Многобайтовая кодировка символов была разработана для работы с более чем 256 символами в правильной bytewise кодировке.

Когда Вы управляете строками (вырезка, разбивание, соединение, и т.д.) , закодированных в многобайтовом кодировании, Вы должны использовать специальные функции, так как два или больше последовательных байта могут представить единственный(отдельный) символ в таких схемах кодирования. Иначе, если Вы применяете однобайтовую строковую функцию к строке, созданной из многобайтовых символов, функция будет не в состоянии обнаруживать начало или окончание многобайтовых символов.

mbstring обеспечивает эти многобайтовые определенные строковые функции, которые помогают Вам иметь дело с многобайтовым кодированием в PHP, который, как предполагается, используется с единственным(отдельным) кодированием байта. В дополнение к этому, mbstring обрабатывает символ, кодирующий преобразование между возможными парами кодирования.

mbstring также предназначен, чтобы обработать кодирование на основе UTF-8 и UCS-2 и других (смотрите ниже), так как mbstring был первоначально разработан для использования в японских web-страницах.

Требования Кодировки Символов PHP4

Вот примеры внутренней кодировки символов, которые работают и НЕ работают с 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:

HTTP ввод и вывод

Конвертация кодировки символов HTTP-ввода/вывода может конвертировать также двоичные данные. Пользователям предлагается контролировать конвертацию кодировки символов, если бинарные данные используются для ввода/вывода HTTP.

Если enctype для HTML-формы установлен multipart/form-data, mbstring не конвертирует кодировку символов в POST-данных. Если это так, строки должны конвертироваться во внутреннюю кодировку символов.

Нет способов управлять конвертацией символов HTTP-ввода из PHP-скрипта. Отключение конвертации символов HTTP-ввода нужно сделать в php.ini.

Отключение конвертации символов HTTP-ввода в php.ini

;; Отключить конвертацию HTTP Input
mbstring.http_input = pass

При использовании PHP как Apache-модуля можно переопределять PHP ini-установку на уровне Virtual Host в httpd.conf или на уровне директории в .htaccess. Обратитесь к разделу Конфигурация и учебнику Apache.

Есть несколько способов включить конвертацию кодировки символов вывода. Один - это использование php.ini, другой - функция ob_start с mb_output_handler как ob_start callback-функция.

Примечание: Для пользователей PHP3-i18n: конвертация вывода mbstring отличается от PHP3-i18n. Кодировка символов конвертируется с использованием буфера вывода.

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

;; Включить конвертацию кодировки символов для всех страниц PHP
;; Включить буферизацию вывода
output_buffering    = On

;; Установить mb_output_handler для включения конвертации вывода
output_handler      = mb_output_handler

Пример скрипта

<?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.language
"neutral"
mbstring.detect_order
NULL
mbstring.http_input
"pass"
mbstring.http_output
"pass"
mbstring.internal_encoding
NULL
mbstring.script_encoding
NULL
mbstring.substitute_character
NULL
mbstring.func_overload
"0"
mbstring.encoding_translation
"0"

Web-браузерам предлагается использовать ту же кодировку при отправку форм. Однако браузеры могут не использовать ту же кодировку символов. См. mb_http_input для определения кодировки браузера.

Если enctype имеет установленное значение multipart/form-data в HTML-формах, mbstring не конвертирует кодировку символов в POST-данных. Пользователь обязан сделать это в скрипте, если конвертация нужна.

Одновременно браузеры достаточно наворочены, чтобы определять кодировку символов в HTML. charset лучше установить в HTTP-шапке/header. Измените default_charset в соответствии с кодировкой символов.

Установки 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

Установки 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

Установки 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 функции должны перегружаться. Список перегружаемых функций дан в таблице.

Перегружаемые функции

значение mbstring.func_overload функция-оригинал перегруженная функция
1 mail mb_send_mail
2 strlen mb_strlen
2 strpos mb_strpos
2 strrpos mb_strrpos
2 substr mb_substr
4 ereg mb_ereg
4 eregi mb_eregi
4 ereg_replace mb_ereg_replace
4 eregi_replace mb_eregi_replace
4 split mb_split


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

Большинство японских символов для своего представления требуют более одного байта на символ. Кроме того, в японском окружении используются разные схемы кодировки. Существуют кодировки EUC-JP, Shift_JIS(SJIS) и ISO-2022-JP(JIS). По мере приобретения популярности Unicode начинает использоваться также UTF-8. при разработке Web-приложений для японской среды важно использовать набор символов, соответствующих текущей задаче - HTTP ввод/вывод, RDBMS и E-mail.

Функция PHP mb_convert_kana

Раздел: Строковые функции PHP Multibyte (mb_string)

конвертирует "kana" из одной в другую ("zen-kaku" ,"han-kaku" и другие)

Читать далее...

Функция PHP mb_convert_variables

Раздел: Строковые функции PHP Multibyte (mb_string)

конвертирует код символа в переменной(-ых)

Читать далее...

Функция PHP mb_decode_numericentity

Раздел: Строковые функции PHP Multibyte (mb_string)

декодирует HTML-ссылку на числовую строку в символ

Читать далее...

Функция PHP mb_detect_order

Раздел: Строковые функции PHP Multibyte (mb_string)

устанавливает/получает порядок определения кодировки символов

Читать далее...

Функция PHP mb_encode_numericentity

Раздел: Строковые функции PHP Multibyte (mb_string)

кодирует символ в HTML-ссылку на числовую строку

Читать далее...

Функция PHP mb_ereg

Раздел: Строковые функции PHP Multibyte (mb_string)

совпадение с регулярным выражением, с многобайтной поддержкой

Читать далее...

Функция PHP mb_eregi

Раздел: Строковые функции PHP Multibyte (mb_string)

совпадение с регулярным выражением, игнорируя регистр, с многобайтной поддержкой

Читать далее...

Функция PHP mb_eregi_replace

Раздел: Строковые функции PHP Multibyte (mb_string)

заменяет регулярное выражение с многобайтной поддержкой, игнорируя регистр

Читать далее...

Функция PHP mb_ereg_match

Раздел: Строковые функции PHP Multibyte (mb_string)

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

Читать далее...

Функция PHP mb_ereg_replace

Раздел: Строковые функции PHP Multibyte (mb_string)

замещает регулярное выражение многобайтной поддержкой

Читать далее...

Функция PHP mb_ereg_search

Раздел: Строковые функции PHP Multibyte (mb_string)

совпадение многобайтного регулярного выражения для предопределённой многобайтной строки

Читать далее...

Функция PHP mb_ereg_search_getpos

Раздел: Строковые функции PHP Multibyte (mb_string)

возвращает стартовую точку следующего совпадения регулярного выражения

Читать далее...

Функция PHP mb_ereg_search_getregs

Раздел: Строковые функции PHP Multibyte (mb_string)

запрашивает результат из последнего совпадения многобайтного регулярного выражения

Читать далее...

Функция PHP mb_ereg_search_init

Раздел: Строковые функции PHP Multibyte (mb_string)

настраивает строку и регулярное выражение для совпадения с регулярным выражением

Читать далее...

Функция PHP mb_ereg_search_pos

Раздел: Строковые функции PHP Multibyte (mb_string)

возвращает позицию и длину совпавшей части многобайтного регулярного выражения для предопределённой многобайтной строки

Читать далее...

Функция PHP mb_ereg_search_regs

Раздел: Строковые функции PHP Multibyte (mb_string)

возвращает совпавшую часть многобайтного регулярного выражения

Читать далее...

Функция PHP mb_ereg_search_setpos

Раздел: Строковые функции PHP Multibyte (mb_string)

устанавливает стартовую точку следующего совпадения регулярного выражения

Читать далее...

Функция PHP mb_get_info

Раздел: Строковые функции PHP Multibyte (mb_string)

получает внутренние настройки mbstring

Читать далее...

Функция PHP mb_http_input

Раздел: Строковые функции PHP Multibyte (mb_string)

определяет кодировку символов HTTP-ввода

Читать далее...

Функция PHP mb_http_output

Раздел: Строковые функции PHP Multibyte (mb_string)

устанавливает/получает кодировку символов HTTP-вывода

Читать далее...

Функция PHP mb_internal_encoding

Раздел: Строковые функции PHP Multibyte (mb_string)

устанавливает/получает внутреннюю кодировку кодировку символов

Читать далее...

Функция PHP mb_language

Раздел: Строковые функции PHP Multibyte (mb_string)

устанавливает/получает текущий язык

Читать далее...

Функция PHP mb_list_encodings

Раздел: Строковые функции PHP Multibyte (mb_string)

возвращает массив всех поддерживаемых кодировок

Читать далее...

Функция PHP mb_output_handler

Раздел: Строковые функции PHP Multibyte (mb_string)

Callback-функция конвертирует кодировку символов в буфере вывода

Читать далее...

Функция PHP mb_parse_str

Раздел: Строковые функции PHP Multibyte (mb_string)

разбирает GET/POST/COOKIE данные и устанавливает глобальную переменную

Читать далее...

Функция PHP mb_regex_encoding

Раздел: Строковые функции PHP Multibyte (mb_string)

возвращает текущую кодировку для многобайтного regex как строку

Читать далее...

Функция PHP mb_regex_set_options

Раздел: Строковые функции PHP Multibyte (mb_string)

Устанавливает/Получает опции по умолчанию для функций mbregex

Читать далее...

Функция PHP mb_split

Раздел: Строковые функции PHP Multibyte (mb_string)

делит многобайтную строку с использованием регулярного выражения

Читать далее...

Функция PHP mb_strimwidth

Раздел: Строковые функции PHP Multibyte (mb_string)

получает усечённую строку специфицированной ширины

Читать далее...

Функция PHP mb_strpos

Раздел: Строковые функции PHP Multibyte (mb_string)

находит позицию первого вхождения строки в строке

Читать далее...

Функция PHP mb_strrpos

Раздел: Строковые функции PHP Multibyte (mb_string)

находит позицию последнего вхождения строки в строке

Читать далее...

Функция PHP mb_strtolower

Раздел: Строковые функции PHP Multibyte (mb_string)

приводит строку к нижнему регистру

Читать далее...

Функция PHP mb_strtoupper

Раздел: Строковые функции PHP Multibyte (mb_string)

приводит строку к верхнему регистру

Читать далее...

Функция PHP mb_substitute_character

Раздел: Строковые функции PHP Multibyte (mb_string)

устанавливает/получает замещающий символ

Читать далее...

Функция PHP mb_substr_count

Раздел: Строковые функции PHP Multibyte (mb_string)

Считает число вхождений подстроки

Читать далее...