Problemas de codificación en .NET
Por: alex | 24 Julio 2007 | Ver comentarios |
Hace poco, me acabo de topar con un bug bastante particular en una aplicación desarrollada en .NET. El problema radica en que el .NET Framework — al parecer — usa diferentes codificaciones para realizar ciertas conversiones en algunos métodos/propiedades de ciertas clases (Ej. Assembly, Uri).
Pude aislar el problema a lo siguiente:
using System;
using System.Reflection;
class Program
{
static void Main(string[] args)
{
string rutaEnsamblado = @"I:\tests\Administración\itextsharp.dll";
Assembly ensamblado = Assembly.LoadFrom(rutaEnsamblado);
Uri uri = new Uri(ensamblado.EscapedCodeBase);
Console.WriteLine(ensamblado.EscapedCodeBase);
Console.WriteLine(uri.LocalPath);
uri = new Uri(@"file:///I:\tests\Administraci%c3%b3n\itextsharp.dll");
Console.WriteLine("\nEn UTF-8: {0}", uri.LocalPath);
}
}Salida del programa:
file:///I:/tests/Administraci%F3n/itextsharp.dll I:\tests\Administraci?n\itextsharp.dll En UTF-8: I:\tests\Administración\itextsharp.dll
Salida de Encoding.Default:
{System.Text.SBCSCodePageEncoding}
[System.Text.SBCSCodePageEncoding]: {System.Text.SBCSCodePageEncoding}
BodyName: "iso-8859-1"
CodePage: 1252
DecoderFallback: {System.Text.InternalDecoderBestFitFallback}
EncoderFallback: {System.Text.InternalEncoderBestFitFallback}
EncodingName: "Western European (Windows)"
HeaderName: "Windows-1252"
IsBrowserDisplay: true
IsBrowserSave: true
IsMailNewsDisplay: true
IsMailNewsSave: true
IsReadOnly: true
IsSingleByte: true
WebName: "Windows-1252"
WindowsCodePage: 1252En la línea 1 de la salida del programa, se puede ver que el caracter ó inicialmente es convertido en %F3 al invocar a EscapedCodeBase, pero en la propiedad LocalPath de la clase Uri, en mi opinión, intenta decodificarse este valor asumiendo que el mismo está en UTF-8, la prueba de esta afirmación es la línea 4.
Actualmente, sólo existe una solución parcial — y fea — a este problema, que es codificar manualmente ciertos caracteres. Si alguien tiene una alternativa mejor o sabe como establecer la codificación por omisión de una aplicación sin tener que tocar la configuración del sistema operativo, estaré muy agradecido.


DN
26 de Julio de 2007, 09:58:23 am
Creo que es un problema de la consola de Windows (el famoso cmd) esa consola usa la codificación clásica de MS-DOS (a estas alturas) y cuando hay caracteres no US tiene resultados impredecibles
alex
26 de Julio de 2007, 10:38:57 am
Este problema se presentó en una aplicación de escritorio y lanzaba un DirectoryNotFoundException a causa de eso.