Вопрос

Сегодня я столкнулся с проблемой с функцией php strpos() потому что он возвращал FALSE, даже если правильный результат был явно равен 0.Это произошло потому, что один параметр был закодирован в UTF-8, а другой (origin - это параметр HTTP GET), очевидно, нет.

Теперь я заметил, что использование mb_strpos функция решила мою проблему.

Мой вопрос заключается в следующем:Разумно ли вообще использовать многобайтовые строковые функции PHP, чтобы избежать подобных проблем в будущем?Должен ли я избегать традиционного strpos, strlen, ereg, и т.д., и т.п.функционирует вообще?

УВЕДОМЛЕНИЕ:Я не хочу устанавливать mbstring.func_overload глобальный в php.ini, потому что это приводит к другим проблемам при использовании библиотеки PEAR.Я использую PHP4.

Это было полезно?

Решение

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

Если вы используете многобайтовую кодировку, отличную от UTF-8, которая не предотвращает отображение отдельных байтов внутри символа как других символов, то никогда не безопасно выполнять поиск по строке с использованием обычных функций поиска по строке.Вы можете обнаружить ложноположительные результаты.Это связано с тем, что сравнение строк PHP в таких функциях, как strpos, выполняется по байтам, и, за исключением UTF-8, который специально разработан для предотвращения этой проблемы, многобайтовые кодировки страдают от проблемы, заключающейся в том, что любой последующий байт в символе, состоящем более чем из одного байта, может совпадать с частью другого символа.

Если строка, которую вы ищете в если строка, которую вы ищете, имеет разные кодировки символов, то преобразование всегда будет необходимо.В противном случае вы обнаружите, что для любой строки, которая была бы представлена по-другому в другой кодировке, она всегда будет возвращать false .Вы должны выполнить такое преобразование при вводе:определите кодировку символов, которую будет использовать ваше приложение, и будьте последовательны в рамках приложения.Каждый раз, когда вы получаете входные данные в другой кодировке, конвертируйте их по пути ввода.

Другие советы

Были некоторые проблемы с функциями mb_ * в версиях PHP до 5.2.Поэтому, если ваш код используется на нескольких платформах с разными версиями PHP, может произойти странное поведение.Кроме того, функция mb_ strpos довольно медленная: ей приходится пропускать количество символов, указанное параметром смещения, чтобы получить реальную позицию байта, используемую внутри.В циклах, в зависимости от функциональности strpos/mb_strpos, это может стать основным узким местом.

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

Например:

header('Content-type: text/html;charset=utf-8');
mysql_query('SET NAMES utf8');

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

Кстати, с появлением PHP 6 все станет намного лучше, поскольку он будет включать полную поддержку юникода.

Вам не обязательно использовать mb_strpos, но вам необходимо убедиться, что все данные в вашем приложении одинаковы:либо mb_string, либо простая строка в одной конкретной кодировке.(Обычно UTF-8.)

Если вы убедитесь, что ваши страницы имеют формат UTF-8, а отправленные вами формы интерпретируются как UTF-8, а ваша база данных хранит UTF-8, в целом все будет в порядке.Операции с индексированными строками (в частности, усечение) могут нарушить последовательность UTF-8, что раздражает, но в целом не является катастрофой.Если вам действительно нужен такой уровень поддержки, mb_strings — ваш единственный вариант (но, конечно, вы должны убедиться, что все части вашего приложения, библиотеки и версия PHP могут правильно с ними справиться).

Разработка сайтов, которые корректно обрабатывают Unicode на PHP, сейчас не так уж и интересна:его поддержка Unicode очень плохая по сравнению с такими языками, как Python и .NET.Есть надежда, что PHP6 улучшит ситуацию.

Я бы рекомендовал использовать следующую библиотеку PHP UTF-8:

http://sourceforge.net/projects/phputf8

Объединение его с вашим приложением ослабляет требования вашего приложения, поскольку не требуется расширение mbstring, но вы все равно получаете строковые функции UTF-8.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top