Следует ли использовать многобайтовую перегрузку (mbstring.func_overload)? - PullRequest
5 голосов
/ 21 октября 2008

Я делаю свой PHP-сайт поддерживающим Unicode. Мне интересно, есть ли у кого-нибудь опыт работы с настройкой mbstring.func_overload, которая заменяет обычные строковые функции (например, strlen) их многобайтовыми эквивалентами (mb_strlen). На странице справки по PHP нет комментариев.

Есть ли потенциальные проблемы, о которых я должен знать? В каких случаях вызов многобайтовой версии - плохая идея?

Полагаю, одним примером будут функции, которые имеют дело с шифрованием, поскольку они могут рассчитывать на обработку строк байтов, а не строк символов.

Кроме того, на странице руководства есть примечание: «Не рекомендуется использовать функцию перегрузки функции в контексте каждого каталога, поскольку она еще не подтверждена как достаточно стабильная в производственной среде и может привести к неопределенному поведению. «

Значит ли это, что он нестабилен в контексте каждого каталога или вообще нестабилен? Формулировка неясна.

Ответы [ 2 ]

5 голосов
/ 24 января 2012

Мой ответ: определенно нет !

Проблема в том, что нет простого способа "сбросить" функции str * после их перегрузки.

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

После того, как вы обнаружили, что это mbstring.func_overload, у вас не так уж много вариантов. Вы можете ini_set mbstring.internal_encoding использовать некоторую кодировку в один байт на символ каждый раз, когда вы вызываете внешнюю библиотеку и сразу же устанавливаете ее обратно, но если ваша библиотека выполняет обратные вызовы для вашего приложения, она просто испортит вещи.

Другой вариант - настроить библиотеку вручную, заменив все функции str * на их аналог mb_string и передав один байт на символ в качестве параметра кодирования. Это, однако, тоже не очень хорошая идея, потому что вы теряете возможность легко обновлять внешнее, и вы можете также вызвать некоторые проблемы с производительностью.

Итак, опять же, не используйте func_overload. Если вы работаете с многобайтовыми строками, используйте соответствующие функции mb_.

4 голосов
/ 21 октября 2008

Одна проблема, которую вы обязательно должны отслеживать, это скрипты сторонних производителей (возможно, расширение библиотеки или груши), которые используют версии функций, не поддерживающие mb. например, библиотеки, использующие strlen(), могут вызвать проблемы, если вы его перегрузите.

также, этот отчет об ошибках показывает, что в виртуальных хостах устранена утечка функций mb_overloaded в 5.2 / 5.3 CVS-версиях. ошибка характерна для конфигураций каждого каталога.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...