UTF-8 a puntos de código Unicode

¿Hay alguna función que cambie UTF-8 a Unicode, dejando caracteres no especiales como letras y números normales?

es decir, la palabra alemana “tchüß” se traduciría como algo así como “tch \ 20AC \ 21AC” (tenga en cuenta que estoy creando los códigos Unicode).

EDITAR: estoy experimentando con la siguiente función, pero aunque esta funciona bien con ASCII 32-127, parece fallar para caracteres de doble byte:

function strToHex ($string) { $hex = ''; for ($i = 0; $i < mb_strlen ($string, "utf-8"); $i++) { $id = ord (mb_substr ($string, $i, 1, "utf-8")); $hex .= ($id <= 128) ? mb_substr ($string, $i, 1, "utf-8") : "&#" . $id . ";"; } return ($hex); } 

¿Algunas ideas?

EDIT 2: solución encontrada: la función PHP ord () no funciona para caracteres de doble byte. Use en su lugar: http://nl.php.net/manual/en/function.ord.php#78032

La conversión de un juego de caracteres a otro se puede hacer con iconv:

http://php.net/manual/en/function.iconv.php

Tenga en cuenta que UTF ya es una encoding Unicode.

Otra forma es simplemente usar htmlentities con el conjunto de caracteres correcto:

http://php.net/manual/en/function.htmlentities.php

Para una forma legible, iría con JSON. No es necesario escapar caracteres no ASCII en JSON, pero PHP lo hace:

 echo json_encode("tchüß"); "tch\u00fc\u00df" 

Para las personas que buscan encontrar el punto de código Unicode para cualquier personaje, esto podría ser útil. A continuación, puede codificar la cadena en el lugar que desee, reemplazar ciertos caracteres con códigos de escape y dejar otros en su forma binaria (por ejemplo, caracteres imprimibles en ascii), según el contexto en el que desee utilizarlo.

De: asignación de puntos de código a formularios de encoding Unicode

La asignación para UTF-32 es, esencialmente, la asignación de identidad: la unidad de código de 32 bits utilizada para codificar un punto de código tiene el mismo valor entero que el punto de código en sí.

 /** * Convert a string into an array of decimal Unicode code points. * * @param $string [string] The string to convert to codepoints * @param $encoding [string] The encoding of $string * * @return [array] Array of decimal codepoints for every character of $string */ function toCodePoint( $string, $encoding ) { $utf32 = mb_convert_encoding( $string, 'UTF-32', $encoding ); $length = mb_strlen( $utf32, 'UTF-32' ); $result = []; for( $i = 0; $i < $length; ++$i ) $result[] = hexdec( bin2hex( mb_substr( $utf32, $i, 1, 'UTF-32' ) ) ); return $result; } 

Con PHP 7, hay un nuevo IntlChar :: ord () para encontrar el punto de código Unicode de un personaje UTF-8 dado:

 var_dump(sprintf('U+%04X', IntlChar::ord('ß'))); # Outputs: string(6) "U+00DF" 

¿Supongo que vas a imprimir tus cadenas en un sitio web?

Estoy almacenando todas mis bases de datos en uft8, usando html_entities ($ string) antes de la salida.

Tal vez tengas que probar html_entities (utf8_encode ($ string));

Una vez creé una función llamada _convert () que codifica todo de manera segura para UTF-8.

Tuve un problema cuando necesito convertir cadena (utf-8 en el valor predeterminado) con caracteres cirílicos a entidades en parte, solo cirílico. Finalmente necesito obtener un resultado similar a JSON, así:

 
  • City - Mocsow (Москва)
  • a esto:

     
  • City - Mocsow (\u041c\u043e\u0441\u043a\u0432\u0430)<\/li>
  • Entonces, tengo una solución compex (mezcla de subj. Autor y Nus):

     function strToHex($string){ $enc="utf-8"; $hex = ''; for ($i = 0; $i < mb_strlen ($string, $enc); $i++){ $id = ord (mb_substr ($string, $i, 1, $enc)); $hex .= ($id <= 128) ? mb_substr ($string, $i, 1, $enc) : toCodePoint(mb_substr ($string, $i, 1, $enc), $enc); } return $hex; } function toCodePoint($string, $encoding){ $utf32 = mb_convert_encoding( $string, 'UTF-32', $encoding ); $length = mb_strlen( $utf32, 'UTF-32' ); $result = Array(); for( $i = 0; $i < $length; ++$i )$result[] = "\u".substr(bin2hex( mb_substr( $utf32, $i, 1, 'UTF-32' ) ), 4,8); return implode("", $result); } $output=strToHex( str_replace( // this is for json compatible array("\"", "\n", "\r", "\t", "/"), array('\"', '\n', "", " ", "\/"), $text ) ); echo $output; 

    Probó en php 5.2.17 🙂

    Probado en php 5.6

     /** * @param string $utf8char * @return string */ function toUnicodeCodePoint($utf8char) { return 'U+' . dechex(mb_ord($utf8char)); } /** * @see https://github.com/symfony/polyfill-mbstring * @param string $s * @return int */ function mb_ord($s) { $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0; if (0xF0 <= $code) { return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80; } if (0xE0 <= $code) { return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80; } if (0xC0 <= $code) { return (($code - 0xC0) << 6) + $s[2] - 0x80; } return $code; } echo toUnicodeCodePoint('😓'); // U+1f613