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:
csharp:
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:
[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
:
code:
{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: 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. 🙂