Функції Мультибайтних Строк

Багато мовах символи можуть виражатися одним байтом. Багатобайтні коди символів використовуються для вираження символів багатьох інших мов. mbstring розроблений для роботи з японськими символами. Однак багато функцій mbstring можуть працювати з іншими кодуваннями, не тільки з японським.

Багатобайтне кодування символів представляє один символ декількома послідовними байтами. Деякі кодування мають shift(escape)-послідовність для початку/закінчення рядків багатобайтних символів. Отже, багатобайтний рядок може бути зруйнований при поділі та/або обрахунку, якщо не використовувати метод надійного кодування багатобайтних символів. Цей модуль надає функції збереження багато байт символів та інші допоміжні функції, такі як функції конвертації.

Оскільки PHP в основі своїй розроблений для ISO-8859-1, деякі багатобайтні кодування погано працюють у PHP. Отже, важливо встановлювати mbstring.internal_encoding для кодування з PHP.

Вимоги Кодування Символів PHP4

однобайтні символи знаходяться в діапазоні 00h-7fh, що сумісне з ASCII

багатобайтне кодування - поза діапазоном 00h-7fh

Ось приклади внутрішнього кодування символів, які працюють та НЕ працюють з PHP.

Кодування символів, які не працюють з 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-введення з PHP-скрипту. Відключення конвертації символів HTTP-введення потрібно зробити у php.ini.

Приклад 1. Відключення конвертації символів HTTP-введення у php.ini

При використанні 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. Кодування символів конвертується за допомогою буфера виводу.

Приклад 2. Налаштування php.ini

Приклад 3. Приклад скрипту

В даний час модуль 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".

Примітка: Кодування символів, що підтримується, не означає, що це працює як внутрішній код символу.

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

Приклад 5. Налаштування php.ini для користувачів EUC-JP

Приклад 6. Налаштування php.ini для користувачів SJIS

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

Оскільки більшість програм PHP написані мовами, що використовують однобайтне кодування символів, є деякі труднощі при роботі з багатобайтними рядками, у тому числі з японськими. Більшість рядкових PHP-функцій, таких як substr(), не підтримують багатобайтні рядки.

Багатобайтне розширення (mbstring) має рядкові функції РНР з підтримкою багатобайтних символів (наприклад, substr() підтримує mb_substr() ).

Багатобайтне розширення (mbstring) також підтримує перевантаження функцій для додавання функціональності багатобайтних рядків без модифікації коду. За допомогою перевантаження функцій деякі рядкові функції PHP будуть перевантажені багатобайтними рядковими функціями. Наприклад, mb_substr() викликається замість substr() ,якщо перевантаження функцій увімкнено. Перевантаження функцій полегшує перенесення програм, підтримуючи лише однобайтні кодування для багатобайтних програм.

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

Для зберігання символу можна використати до 6 байтів.

Багатобайтний символ зазвичай вдвічі ширший за однобайтний. Більші символи називаються "zen-kaku" - що означає "повна ширина", більш вузькі називаються "han-kaku" - що означає "половина ширини". "Zen-kaku" мають зазвичай фіксовану ширину.

Деякі кодування визначають shift(escape)-послідовність для входу/виходу/з багатобайтних рядків.

ISO-2022-JP повинен використовуватись для SMTP/NNTP.

"i-mode" web-сайт передбачається використовувати із SJIS.

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