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

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

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

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

4b9b3361

Ответ 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)

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