Может ли php обнаруживать 4-байтовые кодированные символы utf8?
Я использую таблицы mysql utf8 charset на сервере mysql 5.1, который не поддерживает кодировку utf8mb4 в таблицах. При вставке 4-байтных кодированных символов utf8, таких как "𡃁","𨋢","𠵱","𥄫","𠽌","唧","𠱁"
. В таблице появится всплывающая ошибка или пропустите следующие тексты.
Как я могу программно обнаружить 4-байтовые кодированные символы utf8 в PHP и заменить их?
Ответы
Ответ 1
Следующее регулярное выражение заменит 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. Однако, если у вас есть эта поддержка, deceze preg_replace_callback
является более аккуратным.
(Regex адаптирован из Обеспечение правильного utf-8 в PHP)
Ответ 2
Это должно работать:
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)
Хотя может быть более элегантный способ регулярного выражения для быстрого выражения высоких кодовых точек.