PHP: проблемы с поиском наиболее частого символа в строке UTF-8 (например, 唐 犬 土 用 家犬 尨 犬 山 桑)? - программирование

PHP: проблемы с поиском наиболее частого символа в строке UTF-8 (например, 唐 犬 土 用 家犬 尨 犬 山 桑)?

Из базы данных MySQL я могу извлечь следующие символы utf-8:

"唐犬土用家犬尨犬山桑山犬巴戦師子幻日幻月引綱忠犬愛犬戌年成犬教条教義"

Я пытаюсь найти наиболее частого символа в этой строке. Я попытался поместить каждый элемент в массив $arr и сделать array_count_values ​​($ arr); К сожалению, операции массива (или print_r виновник?) Производят неверно кодированный вывод следующим образом:    [0] => � [1] => � [2] => � [3] => � Я могу хорошо отображать символы в других ситуациях (т.е. Извлекать из MySQL и отображать символы в php файлах OKAY!), Но функции массива (или вывод массива) кажутся испорченными.

Я изменил /etc/php5/apache2/php.ini
и поставьте там default_charset = "utf-8".

(И у меня есть SET NAMES ... и т.д.)

A) Где проблема? B) Могу ли я выполнить эту работу, не прибегая к массивам вообще (т.е. Просто используя строковые функции)?

Спасибо за вашу помощь.

4b9b3361

Ответ 1

Как вы превращаете строку в массив? PHP по умолчанию не является многобайтовым, поэтому он, возможно, разбивает многобайтовые символы посередине.

Помните, что в UTF-8 символы имеют переменную длину. Некоторые символы - один байт, некоторые - два, три или четыре. (Я думаю, что на самом деле возможно до шести). Вам понадобится очень умный алгоритм с разделением строк, который знал бы, когда два или три байта были одним символом, и оставили бы их вместе.

В отсутствие такого алгоритма самым простым решением может быть преобразование вашей строки в UTF-32. Теперь все символы имеют длину четыре байта, вы можете разделить на каждые четыре байта (на упрощенные строковые функции PHP, что означает каждые четыре символа, потому что PHP считает, что байт является символом).

Сочетание диакритики может все еще быть проблемой, хотя (два символа Unicode составляют один печатный символ). Но, по крайней мере, вы не разобьетесь Unicode. Вы можете получить COMBINING DIAERESIS самостоятельно, но это не очень сломано. Я не уверен, насколько сочетаются символы Юникода применительно к восточно-азиатским языкам. Я не специалист Unicode.