Mbstring і PHP необхідно використовувати в розробці веб-додатків
Байти та біти — це дві одиниці для зберігання логічної інформації. Біт можна розглядати як одну дірку, яку можна заповнити одним із двох значень: 0 або 1.
Байт — це група з восьми бітів. З точки зору математики, байт може представляти 256 різних значень (28).
Давайте подумаємо про мову, скажімо, англійську. Він містить кілька символів (a, b, c, … тощо), які в комп’ютері представлені байтами. Загальна кількість символів англійською мовою не перевищує 256, тому кожен символ може бути представлений за допомогою іншої 8-бітної послідовності.
Рядки — це просто набір символів. Зазвичай у PHP рядкові операції працюють із однобайтовими рядками. Наприклад: ви можете порівняти рядки «Привіт» і «Привіт». За допомогою strcmpr() два рядки порівнюватимуться, припускаючи, що кожен символ у рядку займає один байт.
Але подумайте про мову, яка містить більше 256 символів (наприклад, японську), або коли ми хочемо представити символи з кількох мов одночасно. Одного байта пам’яті для кожного символу недостатньо. Ось тут і з’являється багатобайтова концепція.
Рядок японського тексту може призвести до того, що функція strcmpr() повертає неправильне або сміттєве значення, оскільки припущення, що один байт представляє один символ, більше не відповідає дійсності. Коли ми працюємо з рядками з багатобайтним кодуванням, для роботи з цими рядками потрібні спеціальні функції, а не звичайні функції для однобайтових рядків. Для роботи з багатобайтовими рядками в PHP mbstring надає функції багатобайтових рядків.
Розуміння UTF-8
UTF розшифровується як Unicode Transformation Format і є системою кодування, яка має на меті представити кожен символ у кожній мові в одному наборі символів. Існують різні версії UTF, деякі з яких показано нижче:
Формат кодування | опис |
UTF-1 | Сумісний із ISO-2022, застарілим із стандарту Unicode. |
UTF-7 | 7-розрядна система кодування в основному використовувалася в електронній пошті, але не була частиною стандарту Unicode. |
UTF-8 | 8-розрядна система кодування зі змінною шириною, сумісна з ASCII. |
UTF-EBCDIC | 8-розрядна система кодування, змінна ширина, сумісна з EBCDIC. |
UTF-16 | 16-бітна система кодування, змінна ширина. |
UTF-32 | 32-розрядна система кодування, фіксована ширина. |
Ми використовуємо UTF-8 більшу частину часу, коли працюємо з багатобайтовим текстом, тому давайте на мить зосередимося на цьому. UTF-8 кодує символи в кілька байтів за такою схемою:
Отже, як він дізнається, чи зберігається символ в одному байті чи в кількох байтах? Для цього він дивиться на старший біт першого байта.
Код | Значення |
0xxxxxxx | Однобайтовий код |
110ххххх | За цим байтом йде ще один байт |
1110xxxx | За цим байтом йдуть ще два байти |
11110xxx | За цим байтом йдуть ще три байти |
111110xx | За цим байтом йдуть ще чотири байти |
1111110x | За цим байтом йдуть ще п’ять байтів |
10xxxxxx | Продовження багатобайтового символу |
Потім кожен безперервний байт у багатобайтовій послідовності починається з 1 і 0 у двох найстарших бітах, щоб забезпечити спосіб виявлення пошкоджених даних.
Багатобайтові еквіваленти звичайних рядкових функцій
Для часто використовуваних рядкових функцій, таких як strlen(), strops() і substr(), існують багатобайтові еквівалентні функції. Ви повинні використовувати еквівалентні функції під час роботи з багатобайтними рядками.
Таблиця 4: Однобайтові еквівалентні багатобайтові рядкові функції
Один байт | Багатобайтовий | опис |
strlen() | mb_strlen() | Отримати довжину рядка |
strpos() | mb_strpos() | Знайти позицію першого входження рядка в рядок |
substr() | mb_substr() | Повернути частину рядка |
strtolower() | mb_strtolower() | Зробіть рядок малими буквами |
strtoupper() | mb_strtoupper() | Зробіть рядок верхнім регістром |
substr_count() | mb_substr_count() | Підрахуйте кількість входжень підрядка |
split() | mb_split() | Розбити рядок на масив за допомогою регулярного виразу |
пошта() | mb_send_mail() | Надсилайте закодовану пошту |
erg() | mb_ereg() | Збіг регулярного виразу |
зробити() | mb_regi() | Збіг регулярного виразу без урахування регістру |
-
Назва функції: int mb_strlen (рядок $str [, рядок $encoding])
-
Опис: Отримати довжину рядка.
-
Параметри: str (вхідний рядок, довжину якого необхідно визначити)
кодування (кодування символів)
-
Значення, що повертається: кількість символів у вхідному рядку str із кодуванням символів encoding
-
Тип повернення: int
Приклад коду: Ось приклад коду використання функції mb_strlen. Тут вхідний рядок є китайським словом і використовуються три різні варіанти кодування символів.
$ str ="大大";
echo mb_strlen ($ str, 'utf8' ).
echo mb_strlen ($ str, 'gbk’ ).
echo mb_strlen ($ str, ' gb2312').
Обмеження: UTF-8 має деякі обмеження, наприклад-
- Теоретично максимальна довжина символів у кодуванні UTF-8 становить шість байтів.
- 0xFE і 0xFF ніколи не використовуються в цьому кодуванні.
Увімкніть mbstring з php.ini :
- Підтвердьте наявність php_mbstring.dll у папці ext.
- Розкоментуйте ;extension=php_mbstring.dll з php.ini (тобто extension=php_mbstring.dll)
- Перезапустіть сервер.
Конфігурація середовища виконання: щоб увімкнути деякі функції mbstring, слід змінити ще деякі налаштування.
Таблиця 5: Конфігурації у php.ini
Ім’я | Значення за замовчуванням | Змінний варіант |
mbstring.language | нейтральний | PHP_INI_SYSTEM | PHP_INI_PERDIR |
mbstring.detect_order | НУЛЬ | PHP_INI_ALL |
mbstring.http_input | пропуск | PHP_INI_ALL |
mbstring.http_вихід | пропуск | PHP_INI_ALL |
mbstring.internal_encoding | НУЛЬ | PHP_INI_ALL |
mbstring.script_encoding | НУЛЬ | PHP_INI_ALL |
mbstring.substitute_character | НУЛЬ | PHP_INI_ALL |
mbstring.func_overload | 0 | PHP_INI_SYSTEM | PHP_INI_PERDIR |
mbstring.encoding_translation | 0 | PHP_INI_SYSTEM | PHP_INI_PERDIR |
Пояснення параметрів конфігурації:
«Змінна опція» визначає значення змінного режиму. Тут описано, як і звідки можна змінити параметри mbstring. Ось значення значень режиму:
Таблиця 6: Різні режими зміни
Режим | Значення |
PHP_INI_SYSTEM | Ми можемо встановити запис за допомогою php.ini або httpd.conf |
PHP_INI_PERDIR | Ми можемо встановити запис за допомогою php.ini, .htaccess, httpd.conf або .user.ini |
PHP_INI_ALL | Ми можемо встановити вхід з будь-якого місця |
PHP_INI_USER | Ми можемо встановити запис за допомогою сценарію користувача. |
Як змінити сценарій користувача:
Ми можемо використовувати такий код, щоб встановити внутрішнє кодування mbstring зі сценарію користувача:
<?php
ini_set('mbstring.internal_encoding', 'UTF-8');
?>
Як змінити з php.ini:
Ми можемо відредагувати файл php.ini, щоб встановити деякі параметри mbstring.
; Set default language
mbstring.language = Neutral; Set default language to Neutral(UTF-8) (default)
mbstring.language = English; Set default language to English
; Enabled HTTP input encoding translation.
mbstring.encoding_translation = On
; Set default HTTP input character encoding
mbstring.http_input = pass ; No conversion.
mbstring.http_input = auto ; Set HTTP input to auto
Деякі проблеми, пов’язані з mbstring:
Використання функцій mbstring іноді може призвести до певних переслідувань. Тут я обговорю деякі проблеми використання перевантаження багатобайтової функції. Давайте продумаємо сценарій.
Ви ввімкнули опцію mbstring.func_overload у своєму файлі php.ini. Ваша робота йде добре. Ви перевантажуєте функцію однобайтового рядка функціями багатобайтового рядка. Але що станеться, якщо вам знадобиться зовнішня бібліотека, яка часто використовує рядкові функції?
Рішення цієї проблеми є. Ви можете використовувати mbstring.internal_coding. Коли ви викликаєте якусь зовнішню бібліотеку, вона використовуватиме однобайтове кодування, а коли повертатиметеся до вашого проекту, буде реалізовано багатобайтове кодування. Але що станеться, якщо між вашим проектом і зовнішньою бібліотекою буде зворотний виклик? Тут не вдається.
Отже, ви повинні пам’ятати про ці проблеми, використовуючи параметри mbstring.
Важливість mbstring для веб-розробки:
Для розробки будь-якої міжнародної веб-програми використання mbstring є обов’язковим. Інакше ваша програма буде обмежена певними країнами та мовами. Як розробник, я пропоную вам отримати деякі знання в цій області та стати ефективним веб-програмістом.