Ответ 1
Как вы превращаете строку в массив? PHP по умолчанию не является многобайтовым, поэтому он, возможно, разбивает многобайтовые символы посередине.
Помните, что в UTF-8 символы имеют переменную длину. Некоторые символы - один байт, некоторые - два, три или четыре. (Я думаю, что на самом деле возможно до шести). Вам понадобится очень умный алгоритм с разделением строк, который знал бы, когда два или три байта были одним символом, и оставили бы их вместе.
В отсутствие такого алгоритма самым простым решением может быть преобразование вашей строки в UTF-32. Теперь все символы имеют длину четыре байта, вы можете разделить на каждые четыре байта (на упрощенные строковые функции PHP, что означает каждые четыре символа, потому что PHP считает, что байт является символом).
Сочетание диакритики может все еще быть проблемой, хотя (два символа Unicode составляют один печатный символ). Но, по крайней мере, вы не разобьетесь Unicode. Вы можете получить COMBINING DIAERESIS самостоятельно, но это не очень сломано. Я не уверен, насколько сочетаются символы Юникода применительно к восточно-азиатским языкам. Я не специалист Unicode.