Я в процессе создания моего сайта PHP Unicode. Мне интересно, есть ли у кого-нибудь опыт работы с параметром mbstring.func_overload
, который заменяет обычные строковые функции (например, strlen
) их многобайтовыми эквивалентами ( mb_strlen
). На странице руководства PHP нет комментариев.
Есть ли какие-то потенциальные проблемы, о которых я должен знать? Любые случаи, когда вызов многобайтовой версии – плохая идея?
Я полагаю, что одним из примеров будет функционирование, связанное с шифрованием, поскольку они могут рассчитывать на обработку строк байтов, а не строк символов.
Кроме того, на странице руководства есть примечание: «Не рекомендуется использовать функцию перегрузки функции в контексте для каждого каталога, потому что она еще не подтверждена, чтобы быть достаточно стабильной в рабочей среде и может привести к неопределенному поведению».
Означает ли это, что он нестабилен в контексте для каждого каталога или вообще нестабилен? Формулировка неясна.
одна проблема, на которую вы должны обязательно следить, – это сторонние скрипты (возможно, библиотека или расширение груши), которая использует версии функций, не поддерживающие mb. например, библиотеки, которые используют strlen()
могут вызвать проблемы при перегрузке.
также этот отчет об ошибках показывает, что удаление виртуальных хостов из функций mb_overloaded было исправлено в версиях CVS 5.2 / 5.3. ошибка специфична для конфигураций каждого каталога.
Мой ответ: определенно нет !
Проблема в том, что нет простого способа «перезагрузить» функции str * после перегрузки.
В течение некоторого времени это может хорошо работать с вашим проектом, но почти наверняка вы столкнетесь с внешней библиотекой, которая использует строковые функции, например, для реализации двоичного протокола, и они потерпят неудачу. Они потерпят неудачу, и вы будете тратить часы, пытаясь выяснить, почему они терпят неудачу.
После того, как вы обнаружите, что это mbstring.func_overload
, у вас нет слишком большого варианта. Вы можете ini_set mbstring.internal_encoding
кодировать один байт на каждый символ каждый раз, когда вы вызываете внешнюю библиотеку, и сразу же устанавливаете ее обратно, но если ваша библиотека выполняет обратные вызовы в ваше приложение, это просто испортит все.
Другой вариант – настроить библиотеку вручную, сменив все функции str * на их mb_string и передав один байт за символ в качестве параметра кодирования. Это, однако, тоже не отличная идея, потому что вы теряете возможность легко обновлять внешний интерфейс, а также можете вызвать некоторые проблемы с производительностью.
Так что, опять же, не используйте func_overload
. Если вы работаете с многобайтовыми строками, используйте соответствующие функции mb_.