Problemas de codificación en .NET

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. 🙂

2 Replies to “Problemas de codificación en .NET”

  1. 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 😉

Comments are closed.