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: 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. :)