utf8_encode utf8 mb_convert_encoding ejemplo charset array php unicode

mb_convert_encoding - utf8_encode array php



Caracteres Unicode en PHP (7)

Esta pregunta parece embarazosamente simple, pero no he podido encontrar una respuesta.

¿Cuál es el PHP equivalente a la siguiente línea de código C #?

string str = "/u1000";

Este ejemplo crea una cadena con un único carácter Unicode cuyo "valor numérico Unicode" es 1000 en hexadecimal (4096 en decimal).

Es decir, en PHP, ¿cómo puedo crear una cadena con un solo carácter Unicode cuyo "valor numérico Unicode" sea conocido?


Como JSON admite directamente la sintaxis /uxxxx lo primero que me viene a la mente es:

$unicodeChar = ''/u1000''; echo json_decode(''"''.$unicodeChar.''"'');

Otra opción sería usar mb_convert_encoding()

echo mb_convert_encoding(''က'', ''UTF-8'', ''HTML-ENTITIES'');

o hacer uso de la asignación directa entre UTF-16BE (big endian) y el punto de código Unicode:

echo mb_convert_encoding("/x10/x00", ''UTF-8'', ''UTF-16BE'');


Como mencionaron otros, PHP 7 presenta soporte para la sintaxis /u Unicode directamente.

Como también mencionaron otros, la única forma de obtener un valor de cadena de cualquier descripción sensible de caracteres Unicode en PHP es convirtiéndolo de otra cosa (por ejemplo, análisis JSON, análisis HTML o alguna otra forma). Pero esto tiene un costo de rendimiento en tiempo de ejecución.

Sin embargo, hay otra opción. Puedes codificar el personaje directamente en PHP con /x escape binario. La sintaxis de escape /x también es compatible con PHP 5 .

Esto es especialmente útil si prefiere no ingresar el carácter directamente en una cadena a través de su forma natural. Por ejemplo, si se trata de un personaje de control invisible u otro espacio en blanco difícil de detectar.

Primero, un ejemplo de prueba:

// Unicode Character ''HAIR SPACE'' (U+200A) $htmlEntityChar = " "; $realChar = html_entity_decode($htmlEntityChar); $phpChar = "/xE2/x80/x8A"; echo ''Proof: ''; var_dump($realChar === $phpChar); // bool(true)

Tenga en cuenta que, como lo menciona Pacerier en otra respuesta, este código binario es exclusivo de una codificación de caracteres específica. En el ejemplo anterior, /xE2/x80/x8A es la codificación binaria para U + 200A en UTF-8.

La siguiente pregunta es, ¿cómo se obtiene de U+200A a /xE2/x80/x8A ?

A continuación se muestra una secuencia de comandos de PHP para generar la secuencia de escape de cualquier carácter, en función de una cadena JSON, entidad HTML o cualquier otro método una vez que lo tenga como cadena nativa.

function str_encode_utf8binary($str) { /** @author Krinkle 2018 */ $output = ''''; foreach (str_split($str) as $octet) { $ordInt = ord($octet); // Convert from int (base 10) to hex (base 16), for PHP /x syntax $ordHex = base_convert($ordInt, 10, 16); $output .= ''/x'' . $ordHex; } return $output; } function str_convert_html_to_utf8binary($str) { return str_encode_utf8binary(html_entity_decode($str)); } function str_convert_json_to_utf8binary($str) { return str_encode_utf8binary(json_decode($str)); } // Example for raw string: Unicode Character ''INFINITY'' (U+221E) echo str_encode_utf8binary(''∞'') . "/n"; // /xe2/x88/x9e // Example for HTML: Unicode Character ''HAIR SPACE'' (U+200A) echo str_convert_html_to_utf8binary('' '') . "/n"; // /xe2/x80/x8a // Example for JSON: Unicode Character ''HAIR SPACE'' (U+200A) echo str_convert_json_to_utf8binary(''"/u200a"'') . "/n"; // /xe2/x80/x8a


Me pregunto por qué nadie ha mencionado esto todavía, pero puedes hacer una versión casi equivalente usando secuencias de escape en cadenas de comillas dobles :

/x[0-9A-Fa-f]{1,2}

La secuencia de caracteres que coincide con la expresión regular es un carácter en notación hexadecimal.

Ejemplo ASCII:

<?php echo("/x48/x65/x6C/x6C/x6F/x20/x57/x6F/x72/x6C/x64/x21"); ?>

Hola Mundo!

Entonces, para su caso, todo lo que necesita hacer es $str = "/x30/xA2"; . Pero estos son bytes , no caracteres. La representación en bytes del punto de código Unicode coincide con UTF-16 big endian, por lo que podríamos imprimirlo directamente como tal:

<?php header(''content-type:text/html;charset=utf-16be''); echo("/x30/xA2"); ?>

Si está utilizando una codificación diferente, necesitará modificar los bytes en consecuencia (la mayoría se hace con una biblioteca, aunque también es posible hacerlo a mano).

Ejemplo UTF-16 little endian:

<?php header(''content-type:text/html;charset=utf-16le''); echo("/xA2/x30"); ?>

Ejemplo UTF-8:

<?php header(''content-type:text/html;charset=utf-8''); echo("/xE3/x82/xA2"); ?>

También está la función de pack , pero puede esperar que sea lenta.



PHP no conoce estas secuencias de escape Unicode. Pero como las secuencias de escape desconocidas no se ven afectadas, puede escribir su propia función que convierta dichas secuencias de escape Unicode:

function unicodeString($str, $encoding=null) { if (is_null($encoding)) $encoding = ini_get(''mbstring.internal_encoding''); return preg_replace_callback(''/////u([0-9a-fA-F]{4})/u'', create_function(''$match'', ''return mb_convert_encoding(pack("H*", $match[1]), ''.var_export($encoding, true).'', "UTF-16BE");''), $str); }

O con una expresión de función anónima en lugar de create_function :

function unicodeString($str, $encoding=null) { if (is_null($encoding)) $encoding = ini_get(''mbstring.internal_encoding''); return preg_replace_callback(''/////u([0-9a-fA-F]{4})/u'', function($match) use ($encoding) { return mb_convert_encoding(pack(''H*'', $match[1]), $encoding, ''UTF-16BE''); }, $str); }

Su uso:

$str = unicodeString("/u1000");


Pruebe Portable UTF-8 :

$str = utf8_chr( 0x1000 ); $str = utf8_chr( ''/u1000'' ); $str = utf8_chr( 4096 );

Todo funciona exactamente de la misma manera. Puedes obtener el punto de código de un personaje con utf8_ord() . Leer más sobre Portable UTF-8 .


html_entity_decode(''&#x30a8;'', 0, ''UTF-8'');

Esto también funciona Sin embargo, la solución json_decode () es mucho más rápida (alrededor de 50 veces).