Cuando una aplicación intenta codificar o descodificar un carácter pero no existe ninguna asignación, debe implementar una estrategia de reinterpretación. Una estrategia de reinterpretación es un mecanismo de control de errores. Hay dos tipos de estrategias de reinterpretación:
-
Reinterpretación con ajuste perfecto
Cuando los caracteres no tienen una coincidencia exacta en la codificación/descodificación de destino, la aplicación puede decidir si debe intentar asignarlos a un carácter similar.
-
Reinterpretación con cadenas de reemplazo
Si no hay ningún carácter similar adecuado, la aplicación puede especificar qué debe insertarse en la cadena para identificar la omisión.
Por ejemplo, una aplicación puede llamar a GetEncoding(1252, 0, 0) (vea GetEncoding); así se especifica la página de códigos 1252 (la página de códigos de Windows para los idiomas de Europa occidental) con encoderFallback y decoderFallback establecidos en cero. El comportamiento predeterminado será una asignación de ajuste perfecto para algunos caracteres Unicode. Por ejemplo, CIRCLED LATIN CAPITAL LETTER S (U+24C8) se cambiará a LATIN CAPITAL LETTER S (U+0053) antes de codificarse; SUPERSCRIPT FIVE (U+2075) se cambiará a DIGIT FIVE (U+0035). Después, si descodifica la página de códigos 1252 a Unicode de nuevo, se perderá el círculo que rodea la letra y 25 pasará a ser 25. Otras conversiones pueden ser aún más drásticas: es posible que el símbolo INFINITY de Unicode (U+221E) se asigne a DIGIT EIGHT (U+0038).
Las estrategias de ajuste perfecto varían en función de la página de códigos, y no se encuentran documentadas de manera detallada. Por ejemplo, para algunas páginas de códigos, los caracteres latinos de ancho completo se asignarán a caracteres latinos de ancho medio, que son más comunes; para otras, no sucederá lo mismo.
Incluso con una estrategia de ajuste perfecto agresiva, algunos caracteres no tienen un ajuste imaginable en algunas codificaciones. Por ejemplo, un ideograma chino no tiene ninguna asignación razonable para la página de códigos 1252. En ese caso, se utilizaría una cadena de reemplazo. De forma predeterminada, esta cadena es simplemente un carácter QUESTION MARK (U+003F).
La asignación de ajuste perfecto es el comportamiento predeterminado para Encoding, que codifica los datos Unicode en datos de página de códigos, y hay aplicaciones antiguas que se basan en este comportamiento. Sin embargo, la mayoría de las aplicaciones nuevas deberían evitarlo por razones de seguridad. (Por ejemplo, las aplicaciones no deberían asignar nombres de dominio mediante una codificación de ajuste perfecto). Dispone de las siguientes alternativas a la asignación de ajuste perfecto:
-
Para evitar problemas de reinterpretación de caracteres, utilice sólo las codificaciones Unicode (UTF8Encoding, UnicodeEncoding y UTF32Encoding).
Precaución |
|---|
| Aunque UTF7Encoding es, técnicamente, una codificación Unicode, es menos sólida y segura que otras codificaciones. En algunos casos, cambiar un bit puede modificar radicalmente la interpretación de una cadena UTF-7 completa. En otros casos, es posible que cadenas UTF-7 sustancialmente diferentes codifiquen el mismo texto. Por consiguiente, si puede elegir, no debería utilizar UTF-7. Se prefiere UTF-8. |
-
Utilice EncoderExceptionFallback y DecoderExceptionFallback, que inician la excepción (EncoderFallbackException y DecoderFallbackException, respectivamente) si un carácter no se asigna con exactitud.
-
Utilice EncoderReplacementFallback y DecoderReplacementFallback para sustituir siempre una cadena de reemplazo si un carácter no tiene una asignación exacta. (Éste es el comportamiento predeterminado para ASCIIEncoding). De forma predeterminada, esta cadena será simplemente un signo de interrogación, pero existen métodos que permiten que una aplicación elija una cadena diferente. Aunque suele ser un carácter individual, no es obligatorio. Para DecoderReplacementFallback, que se utiliza al transformar texto en Unicode, un carácter que suele utilizarse es REPLACEMENT CHARACTER (U+FFFD).
-
Escriba su propio EncoderFallback o DecoderFallback, para implementar la estrategia que prefiera. Vea Ejemplo Fallback Encoding Application.
Dos comentarios adicionales acerca de las estrategias de reinterpretación de codificación (o descodificación) con ajuste perfecto:
-
El ajuste perfecto es básicamente una cuestión de codificación, más que de descodificación. Hay muy pocas páginas de códigos que contengan caracteres que no se puedan asignar correctamente a Unicode. Dichos caracteres no se utilizan con frecuencia, motivo por el cual se omitieron de Unicode.
-
No hay objetos con nombre compatibles que se correspondan con las reinterpretaciones con ajuste perfecto, y la reinterpretación con ajuste perfecto de cada página de códigos es diferente. Si desea poder alternar entre el ajuste perfecto y alguna otra reinterpretación de un objeto Encoding, realice una copia del objeto con ajuste perfecto en una variable antes de asignar cualquier otro objeto de reinterpretación. Después, podrá recuperar la reinterpretación con ajuste perfecto si vuelve a asignar ese valor a System.Text.Encoding.EncoderFallback (o System.Text.Encoding.DecoderFallback).