Разбить строку utf8 на массив символов - PullRequest
3 голосов
/ 25 февраля 2012

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

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

Зельф хеб ик маар Эен Врааг: Ви Бен Джидж?

Это моя функция:

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] => ?
)

Ответы [ 6 ]

14 голосов
/ 12 мая 2016

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

Я нашел это хорошее решение на страницах справки PHP .

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

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

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

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

Аналогичный ответ также здесь .

11 голосов
/ 25 февраля 2012

Для функций 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.

4 голосов
/ 23 марта 2012

Если вы не уверены в доступности библиотеки функций 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

2 голосов
/ 25 февраля 2012

В PHP есть функция многобайтового разбиения, mb_split.

1 голос
/ 06 марта 2012

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

0 голосов
/ 25 февраля 2012
mb_internal_encoding("UTF-8"); 

46 массивов - выкл 41 массив

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...