Recientemente tuve la necesidad de convertir emojis representados en NCR decimal de la forma "��"
a Unicode escapado de la forma "\uD83D\uDE00"
.
Por eso desarrolle las siguientes funciones que dejo aquí como referencia futura y en caso de que sean de utilidad para alguien más.
function replaceDecNCR2EscapedUnicode($argstr) { $result = ''; for ($i = 0; $i < strlen($argstr); $i++) { if ($i < (strlen($argstr) - 3) && $argstr[$i] == '&' && $argstr[$i + 1] == '#' && is_numeric($argstr[$i + 2])) { $tempString = ''; $i += 2; while ($i < strlen($argstr) - 1 && is_numeric($argstr[$i])) { $tempString .= $argstr[$i]; $i++; } if ($argstr[$i] == ';') { $result .= '\u' . strtoupper(dechex($tempString)); } } else { $result .= $argstr[$i]; } } return $result; } function replaceEscapedUnicode2DecNCR($argstr) { $result = ''; for ($i = 0; $i < strlen($argstr); $i++) { if ($i < (strlen($argstr) - 3) && $argstr[$i] == '\\' && $argstr[$i + 1] == 'u' && ctype_xdigit($argstr[$i + 2])) { $tempString = ''; $i += 2; while (ctype_xdigit($argstr[$i])) { $tempString .= $argstr[$i]; $i++; } $i--; $result .= '&#'.hexdec($tempString).';'; } else { $result .= $argstr[$i]; } } return $result; }
Las funciones reciben un texto que incluya ya sea caracteres Unicode escapados o NCR decimal y convierten dichos caracteres a la contraparte solicitada, el texto “normal” no es afectado.
Ejemplo
$texto = "Hola ��"; $texto = replaceDecNCR2EscapedUnicode($texto); echo $texto; // Hola \uD83D\uDE00 $texto = replaceEscapedUnicode2DecNCR($texto); echo $texto; // Hola ��
Referencia
En mi búsqueda por ejemplos encontré la página: http://www.endmemo.com/unicode/unicodeconverter.php que permite convertir online diferentes tipos de codificación de caracteres.