Должен ли я рефакторинг все мои рамки для использования функций mbstring? - PullRequest
1 голос
/ 19 декабря 2011

В настоящее время я использую mbstring.func_overload = 7 для работы с кодировкой UTF-8.

Я думаю реорганизовать весь вызов func для использования mb_* функций.

Как вы думаете, этообязательно, или с PHP 6 или более новой версией многобайтовая проблема будет решена другим способом?

Ответы [ 2 ]

4 голосов
/ 06 февраля 2012

Не рекомендуется, если вы используете библиотеки, созданные другими людьми. Вот три причины.

  1. Перегрузка может нарушить поведение библиотек, которые не ожидают перегрузки.
  2. Ваша среда может быть повреждена в среде без перегрузки.
  3. В зависимости от перегрузки уменьшается количество потенциальных пользователей вашей платформы из-за 2

Хорошим примером 1. является неправильный расчет размера байта в поле HTTP Content-Length с использованием strlen . Причина в том, что перегруженная функция strlen не возвращает число байтов , а количество символов . Вы можете увидеть проблемы реального мира в CakePHP и Zend_Http_Client .

Edit: устаревший mbstring.func_overload рассматривается в PHP 5.5 или 5.6 (из почты сопровождающего mbstring в апреле 2012 г.). Так что теперь вы должны избегать mbstring.func_overload.

Рекомендуемая политика обработки многобайтовых символов для различных платформ заключается в прямом использовании mbstring, intl или iconv. Если вам действительно нужны резервные функции для обработки многобайтовых символов, используйте function_exists () .

Вы можете увидеть случаи в Wordpress и MediaWiki .

  1. WordPress: wp-includes / compact.php
  2. MediaWiki: Резервный класс

Некоторые из CMS, такие как Drupal ( unicocde.inc ), вводят слой абстракции мутибайта.

Я думаю, что уровень абстракции не очень хорошая идея. Причина в том, что количество обрабатываемых многобайтовых функций, необходимых во многих случаях, меньше 10, а многобайтовые функции просты в использовании и снижают производительность при переключении обработки на mbstring или intl или iconv, если эти модули установлены.

Минимальное требование для обработки многобайтовых символов: mb_substr () и обработка недопустимой последовательности байтов. Вы можете увидеть случаи резервной функции для mb_substr () в вышеупомянутых CMS.
Я ответил об обработке недопустимой последовательности байтов в следующем месте: Замена недопустимых символов UTF-8 на вопросительные знаки, mbstring.substitute_character кажется

1 голос
/ 19 декабря 2011

для строки utf-8 (конечно)

Да, конечно . Есть много вещей, которые вы можете сделать со строками, хотя. UTF-8 обратно совместим с ASCII. Если вы хотите работать только с символами ASCII строки, это может иметь или не иметь значение. Это зависит от что вам нужно сделать со своими строками.

Если вы хотите получить прямой ответ: Нет , вам не следует переводить каждую функцию в функцию mb_, потому что она, вероятно, излишня. Стоит ли проверять свои сценарии использования, может ли многобайтовая строка UTF-8 повлиять на результаты и соответственно изменить рефакторинг? Да.

...