Может ли php обнаруживать 4-байтовые кодированные символы utf8?

Я использую таблицы mysql utf8 charset на сервере mysql 5.1, который не поддерживает кодировку utf8mb4 в таблицах. При вставке 4- "𡃁","𨋢","𠵱","𥄫","𠽌","唧","𠱁" кодированных символов utf8, таких как "𡃁","𨋢","𠵱","𥄫","𠽌","唧","𠱁" . В таблице появится всплывающая ошибка или пропустите следующие тексты.

Как я могу программно обнаружить 4-байтовые кодированные символы utf8 в PHP и заменить их?

Следующее регулярное выражение заменит 4-байтные символы UTF-8:

 function replace4byte($string) { return preg_replace('%(?: \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15 | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 )%xs', '', $string); } var_dump(replace4byte('d'), replace4byte('d𡃁d')); 

Это не зависит от модификатора /u , поэтому вам не нужно беспокоиться о UTF-8 для компиляции PCRE. Однако, если у вас есть эта поддержка, preg_replace_callback preg_replace_callback является более аккуратным.

(Regex адаптирован для обеспечения правильности utf-8 в PHP )

Это должно работать:

 if (max(array_map('ord', str_split($string))) >= 240) 

Рациональное то, что код указывает и включает U + FFFF, кодируется как три байта формы 1110xxxx 10xxxxxx 10xxxxxx . Более высокие кодовые точки имеют форму 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx , то есть старший байт имеет значение 240 или выше. Если в строке есть такие байты, это индикатор для 4-байтовой последовательности.

Если вы хотите удалить длинные символы, это будет делать:

 preg_replace_callback('/./u', function (array $match) { return strlen($match[0]) >= 4 ? null : $match[0]; }, $string) 

Хотя может быть более элегантный способ регулярного выражения для прямого выражения высоких кодовых точек.