utf8 convertir convert charset php utf8mb4

charset - php convertir ascii en utf 8



¿Puede php detectar caracteres de 4 bytes codificados en utf8? (2)

Esto debería funcionar:

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

El hecho de que el código apunte hasta e incluyendo U + FFFF se codifica como tres bytes de la forma 1110xxxx 10xxxxxx 10xxxxxx . Los puntos de código más altos tienen el formato 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx , es decir, el byte más alto tiene un valor de 240 o superior. Si hay tales bytes en la cadena, es un indicador para una secuencia de 4 bytes.

Si quieres eliminar caracteres largos, esto hará:

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

Aunque puede haber una forma de expresión regular más elegante para expresar los puntos de código altos directamente.

Estoy utilizando tablas de MySQL utf8 charset en un servidor mysql 5.1, que no admite la codificación utf8mb4 en las tablas. Al insertar caracteres utf8 codificados de 4 bytes como "𡃁","𨋢","𠵱","𥄫","𠽌","唧","𠱁" . La tabla mostrará un error emergente u omitirá los siguientes textos.

¿Cómo puedo detectar de manera programática los caracteres utf8 codificados de 4 bytes en PHP y reemplazarlos?


La siguiente expresión regular reemplazará los caracteres UTF-8 de 4 bytes:

function replace4byte($string, $replacement = '''') { 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'', $replacement, $string); } var_dump(replace4byte(''d''), replace4byte(''d𡃁d''));

Esto no se basa en el modificador /u , por lo que no debería preocuparse por la compilación de UTF-8 para PCRE. Sin embargo, si tiene ese soporte, el preg_replace_callback de deceze es más limpio.

(Regex adaptado de Asegurar utf-8 válido en PHP )