Я пытаюсь разбить строку, закодированную в utf8, на массив символов. Функция, которую я сейчас использую, используется для работы, но по какой-то причине она больше не работает. Что может быть причиной. И еще лучше, как я могу это исправить?
Это моя строка:
Zelf heb ik maar één vraag: wie ben jij?
Это моя функция:
function utf8Split($str, $len = 1) { $arr = array(); $strLen = mb_strlen($str); for ($i = 0; $i < $strLen; $i++) { $arr[] = mb_substr($str, $i, $len); } return $arr; }
Это результат:
Array ( [0] => Z [1] => e [2] => l [3] => f [4] => [5] => h [6] => e [7] => b [8] => [9] => i [10] => k [11] => [12] => m [13] => a [14] => a [15] => r [16] => [17] => e [18] => ́ [19] => e [20] => ́ [21] => n [22] => [23] => v [24] => r [25] => a [26] => a [27] => g [28] => : [29] => [30] => w [31] => i [32] => e [33] => [34] => b [35] => e [36] => n [37] => [38] => j [39] => i [40] => j [41] => ? )
Для функций mb_...
вы должны указать кодировку кодировки.
В вашем примере кода это особенно следующие две строки:
$strLen = mb_strlen($str, 'UTF-8'); $arr[] = mb_substr($str, $i, $len, 'UTF-8');
Полная картина:
function utf8Split($str, $len = 1) { $arr = array(); $strLen = mb_strlen($str, 'UTF-8'); for ($i = 0; $i < $strLen; $i++) { $arr[] = mb_substr($str, $i, $len, 'UTF-8'); } return $arr; }
Потому что вы используете UTF-8 здесь. Однако, если вход неправильно закодирован, это не будет работать «больше» – только потому, что оно не предназначено для чего-то другого.
Вы можете поочередно обрабатывать кодированные строки UTF-8 с регулярными выражениями PCRE, например, это вернет то, что вы ищете, в меньшем количестве кода:
$str = 'Zelf heb ik maar één vraag: wie ben jij?'; $chars = preg_split('/(?!^)(?=.)/u', $str);
Рядом с preg_split
есть также mb_split
.
Это лучшее решение !:
Я нашел это приятное решение на страницах руководства PHP .
preg_split('//u', $str, null, PREG_SPLIT_NO_EMPTY);
Он работает очень быстро:
В PHP 5.6.18 он разбил 6 МБ большой текстовый файл за считанные секунды.
Лучше всего. Он не нуждается в поддержке MultiByte (mb_)!
Подобный ответ также здесь .
Если вы не уверены в доступности библиотеки функций mb_string, используйте:
Версия 1:
function utf8_str_split($str='',$len=1){ preg_match_all("/./u", $str, $arr); $arr = array_chunk($arr[0], $len); $arr = array_map('implode', $arr); return $arr; }
Версия 2:
function utf8_str_split($str='',$len=1){ return preg_split('/(?<=\G.{'.$len.'})/u', $str,-1,PREG_SPLIT_NO_EMPTY); }
Обе функции, протестированные в PHP5
Существует mb_split
функция split в PHP, mb_split
.
Я узнал, что é не был тем персонажем, которого я ожидал. По-видимому, есть разница между né и ńe. Я заработал, сначала нормализуя строку.
mb_internal_encoding("UTF-8");
46 массивов – выключено 41 массив