2012-02-20 13 views
25

¿Es posible ingresar un carácter y recuperar el valor Unicode? por ejemplo, puedo poner & # 12103 en html para dar salida a "⽇", ¿es posible dar ese carácter como argumento a una función y obtener el número como resultado sin construir una tabla Unicode?¿Puedo obtener el valor Unicode de un personaje o viceversa con php?

$val = someFunction("⽇");//returns 12103 

o al revés?

$val2 = someOtherFunction(12103);//returns "⽇" 

Me gustaría ser capaz de dar salida a los personajes reales a no la página de los códigos, y también me gustaría ser capaz de obtener el código del carácter, si es posible. Lo más cercano que llegué a lo que quiero es php.net/manual/en/function.mb-decode-numericentity.php pero no puedo hacerlo funcionar, ¿es este el código que necesito o estoy en la pista incorrecta?

Respuesta

27
function _uniord($c) { 
    if (ord($c{0}) >=0 && ord($c{0}) <= 127) 
     return ord($c{0}); 
    if (ord($c{0}) >= 192 && ord($c{0}) <= 223) 
     return (ord($c{0})-192)*64 + (ord($c{1})-128); 
    if (ord($c{0}) >= 224 && ord($c{0}) <= 239) 
     return (ord($c{0})-224)*4096 + (ord($c{1})-128)*64 + (ord($c{2})-128); 
    if (ord($c{0}) >= 240 && ord($c{0}) <= 247) 
     return (ord($c{0})-240)*262144 + (ord($c{1})-128)*4096 + (ord($c{2})-128)*64 + (ord($c{3})-128); 
    if (ord($c{0}) >= 248 && ord($c{0}) <= 251) 
     return (ord($c{0})-248)*16777216 + (ord($c{1})-128)*262144 + (ord($c{2})-128)*4096 + (ord($c{3})-128)*64 + (ord($c{4})-128); 
    if (ord($c{0}) >= 252 && ord($c{0}) <= 253) 
     return (ord($c{0})-252)*1073741824 + (ord($c{1})-128)*16777216 + (ord($c{2})-128)*262144 + (ord($c{3})-128)*4096 + (ord($c{4})-128)*64 + (ord($c{5})-128); 
    if (ord($c{0}) >= 254 && ord($c{0}) <= 255) // error 
     return FALSE; 
    return 0; 
} // function _uniord() 

y

function _unichr($o) { 
    if (function_exists('mb_convert_encoding')) { 
     return mb_convert_encoding('&#'.intval($o).';', 'UTF-8', 'HTML-ENTITIES'); 
    } else { 
     return chr(intval($o)); 
    } 
} // function _unichr() 
+0

Hola Marcos, Gracias por el código. ¿Esto es de algún lado en línea con una explicación de cómo funciona? – Totoro

+0

Es el código que uso en PHPExcel; pero no puedo recordar dónde lo obtuve a partir de ahora, o encontrar una referencia a su fuente ... pero se usa en varias bibliotecas –

+1

La primera función toma una cadena (un carácter Unicode consta de varios octetos), verifica el primeros bits del primer octeto para descubrir la longitud del carácter en octetos (creo que está usando UTF8). A continuación, quita los bits de control de cada octeto y convierte los bits restantes (los que forman el carácter unicode) en el número que desea. Esa conversión es sencilla, simplemente convirtiendo el entero en cadena. –

3

Puede utilizar las siguientes funciones

Para codificar

string utf8_encode (string $data) 

http://php.net/manual/en/function.utf8-encode.php

para la decodificación de

string utf8_decode (string $data) 

http://php.net/manual/en/function.utf8-decode.php

También puedes ver

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

<?php 


echo htmlspecialchars_decode("&#12103");//will print ⽇ 

?> 
+1

hola Akhil, los he visto pero solo funcionan con los caracteres del rango ASCII, cualquier cosa por encima de eso se convierte en un galimatías. – Totoro

+0

Por favor revise mi edición y vea si es útil –

+0

hola @Akhil, gracias, esto funciona, es una pena que no haya una opción de codificación. – Totoro

8

Esto también funciona, (por alguien que entiende bitshifting esto podría ser más fácil de leer que contesta al signo de los panaderos):

public function ordinal($str){ 
    $charString = mb_substr($str, 0, 1, 'utf-8'); 
    $size = strlen($charString);   
    $ordinal = ord($charString[0]) & (0xFF >> $size); 
    //Merge other characters into the value 
    for($i = 1; $i < $size; $i++){ 
     $ordinal = $ordinal << 6 | (ord($charString[$i]) & 127); 
    } 
    return $ordinal; 
} 
+0

Hola, probé tu respuesta frente a Marks y creo que hay un problema con los tuyos (porque no soy bueno con el cambio de bit no sé qué). echo "

" .ordinal ("響"). "::" ._uniord ("響"). "

"; Devuelve: 105 :: 38911 (Cabe 38911) – Totoro

+0

Hola, gracias por la respuesta. El error parece estar en la codificación predeterminada mb_internal_encoding(), si eso no es 'utf-8', la recuperación del primer carácter falla. Lo he solucionado al agregar explícitamente la codificación a mb_substr. – user23127

+0

He votado como funciona ahora, pero dejaré la respuesta tal como estaba. Gracias por la alternativa – Totoro

18

Aquí es una implementación más compacta de unichr/uniord basado en pack:

// code point to UTF-8 string 
function unichr($i) { 
    return iconv('UCS-4LE', 'UTF-8', pack('V', $i)); 
} 

// UTF-8 string to code point 
function uniord($s) { 
    return unpack('V', iconv('UTF-8', 'UCS-4LE', $s))[1]; 
} 
+0

Jail Breaking ...: D – kupendra

0

Si está utilizando PHP7.2 (o posterior), no es necesario definir una nueva función; ¡existen dos funciones para sus propósitos desde la extensión/biblioteca Multibyte String!

Para obtener el punto de código de un carácter (es decir, el valor Unicode), use mb_chr(); y para obtener un personaje específico de ese valor, use mb_ord().

ej .:

mb_chr(12103, "utf8"); // ⽇ 
mb_ord("⽇", "utf8"); // 12103 
Cuestiones relacionadas