Convertir Decimal NCR a Unicode escapado en PHP y viceversa

Recientemente tuve la necesidad de convertir emojis representados en NCR decimal de la forma "��" a Unicode escapado de la forma "\uD83D\uDE00".

Para eso desarrolle la 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 &#55357;&#56832;";
$texto = replaceDecNCR2EscapedUnicode($texto); 
echo $texto;
// Hola \uD83D\uDE00
$texto = replaceEscapedUnicode2DecNCR($texto);
echo $texto;
// Hola &#55357;&#56832;

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.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *