2012-02-24 2 views
3

Я пытаюсь разбить utf8 закодированную строку в массив символов. Функция, которую я сейчас использую, используется для работы, но по какой-то причине она больше не работает. Что может быть причиной. И еще лучше, как я могу это исправить?Split utf8 string в массив символов

Это моя строка:

Zelf хеб ик мааровое ееп vraag: Wie бен 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] => ? 
) 
+1

Определить, что «не работает». Что он делает, что он не должен делать и/или что он не делает, что он должен делать? –

+0

Часть éé не разделена так, как должно было – tersmitten

+0

РЕШЕНИЕ: http://stackoverflow.com/a/21654160/2377343 –

ответ

1

Я узнал, что é не был персонаж, которого я ожидал. По-видимому, есть разница между né и ńe. Сначала я начал работать с normalizing.

10

Для функций 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 здесь. Однако, если вход неправильно закодирован, это не будет работать «больше» - только потому, что оно не предназначено для чего-то другого.

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

$str = 'Zelf heb ik maar één vraag: wie ben jij?'; 

$chars = preg_split('/(?!^)(?=.)/u', $str); 

Рядом с preg_split есть также mb_split.

+0

Я определяю кодировку глобально с помощью: mb_internal_encoding ('UTF-8'); – tersmitten

+0

Это должно установить его (но он также устанавливает кодировку ввода и вывода HTTP), вы можете проанализировать строку (например, [с помощью hexdump] (http://stackoverflow.com/questions/1057572/how-can-i-get- a-hex-dump-of-a-string-in-php)) и проверить кодировку строки из первых рук, я подозреваю, что параметр кодировки неверен или кодировка строки кодировки является чем-то другим, чем UTF-8. – hakre

0
mb_internal_encoding("UTF-8"); 

46 массивов - выходные 41 массивов

4

Если вы не уверены в наличии 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

10

Это лучшее решение !:

Я нашел это приятное решение в PHP manual pages.

preg_split('//u', $str, null, PREG_SPLIT_NO_EMPTY); 

Он работает очень быстро:

В PHP 5.6.18 она разделилась на 6 MB большой текстовый файл в считанные секунды.

Лучшее из всех. Он не нуждается в поддержке MultiByte (mb_)!

Похожие ответы также here.