Intereting Posts
Magento paypal rounding проблема со скидкой Перезагрузите страницу после успешной отправки формы с помощью ajax Как вы используете Javascript для дублирования полей формы? Как изменить общую сумму корзины с помощью фильтра или крючка – WooCommerce Почему array_diff () дает Array ошибку строковой конверсии? AES 128-битное дешифрование частичного файла CTR с помощью PHP Как преобразовать объекты HTML, такие как & # 8211; к их эквивалентам символов? Laravel 4.2: включить PHP-файл (библиотеку) в контроллер Переменные сеанса устанавливаются только после обновления страницы. PHP sprintf escaping% PHP и MySQLi – невозможно передать параметр 2 по ссылке в Доступ к узлам узлов пространства имен в XML с помощью SimpleXML PHP Permission denied: /var/www/abc/.htaccess pcfg_openfile: невозможно проверить файл htaccess, убедиться, что он доступен для чтения? Получение данных POST из вызова AJAX на PHP Как создать одноразовую ссылку для скачивания с Amazon S3?

Безопасно использовать strpos с строками UTF-8?

У меня есть группа строк с разными кодировками. Переменная $charset содержит кодировку текущей строки.

 $content = iconv($charset, 'UTF-8', $content); 

С этим сделано, безопасно ли использовать strpos , strlen , substr и т. Д., А не их многобайтовый эквивалент? Я спрашиваю об этом, потому что я также использую preg_match . Поэтому, если я использую PREG_OFFSET_CAPTURE чтобы получить позицию слова в строке, я не могу использовать это значение с mb_substr для удаления всего слова перед словом.

Это полностью зависит от того, что вы хотите сделать. Основные функции strlen и подобные функции работают с байтами . Каждое число, которое они принимают и возвращают, представляет собой количество байтов или смещение байта. Функции mb_ * работают с кодировкой символов . Все числа, которые они принимают и возвращают, являются символами или смещениями.

Если у вас есть безопасный способ получить смещение байта в строке («безопасно» означает, что смещение не находится в середине многобайтового символа), а затем, например, обрезать все до этого смещения с помощью substr , что будет работать просто отлично. Например:

 $str = '漢字'; $offset = strpos($str, '字'); $cropped = substr($str, $offset); 

Работает отлично.

Однако это не сработает:

 $cropped = substr($str, $offset, 1); 

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

Функции, такие как strlen () count bytes, а не символы.

Подробнее см. Примечания в Руководстве по PHP :

Заметка:

strlen () возвращает количество байтов, а не количество символов в строке.

используйте функции mb_ *, если вы работаете с UTF-8, если у вас нет настроек php.ini mbstring.func_overload, чтобы перегрузить стандартные функции strops (), strlen (), substr () и т. д. … затем strlen () будет считать символы