Функції Мультибайтних Строк
Багато мовах символи можуть виражатися одним байтом. Багатобайтні коди символів використовуються для вираження символів багатьох інших мов. 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. Перевантажувані функції
| 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() |
Для зберігання символу можна використати до 6 байтів.
Багатобайтний символ зазвичай вдвічі ширший за однобайтний. Більші символи називаються "zen-kaku" - що означає "повна ширина", більш вузькі називаються "han-kaku" - що означає "половина ширини". "Zen-kaku" мають зазвичай фіксовану ширину.
Деякі кодування визначають shift(escape)-послідовність для входу/виходу/з багатобайтних рядків.
ISO-2022-JP повинен використовуватись для SMTP/NNTP.
"i-mode" web-сайт передбачається використовувати із SJIS.
інформація про символи Japanese/Korean/Chinese