У меня есть группа строк с разными кодировками. Переменная $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 () будет считать символы