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.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:
[code num=1 start=1]file:///I:/tests/Administraci%F3n/itextsharp.dll I:\tests\Administraci?n\itextsharp.dll En UTF-8: I:\tests\Administración\itextsharp.dll[/code]Salida de Encoding.Default:
[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: 1252
En 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.
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
Este problema se presentó en una aplicación de escritorio y lanzaba un DirectoryNotFoundException a causa de eso.