Intereting Posts

Разделить строку utf8 на массив символов

Я пытаюсь разбить строку, закодированную в 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 массив