Categories
.NET

Problemas de codificación en .NET

El .NET Framework, al parecer usa diferentes codificaciones para realizar ciertas conversiones en algunos métodos/propiedades de ciertas clases (Ej. Assembly, Uri)

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 on “Problemas de codificación en .NET”

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.