Categories
Firefox Varios

Promocionando IE7

Pues eso, estoy promocionando a uno de mis navegadores favoritos! ie7.com 🙂

Categories
.NET ASP.NET

Eliminando acentos con .NET 1.x

En la entrada anterior vimos que con .NET 2 la eliminación acentos (y otros diacríticos) es una tarea trivial, pues bien
para hacer esta misma tarea con Mono -que al parecer no tiene implementado esta parte todavía- o versiones anteriores del .NET Framework 2, se puede usar el API de la función FoldString
o tomar parte del código de VietPad, escrito por Quan Nguyen.

csharp:

public class Program
{
    #region Foldstring
    [Flags]
    private enum MapFlags
    {
        MAP_FOLDCZONE = 0x00000010,// fold compatibility zone chars
        MAP_PRECOMPOSED = 0x00000020,// convert to precomposed chars
        MAP_COMPOSITE = 0x00000040, // convert to composite chars
        MAP_FOLDDIGITS = 0x00000080 // all digits to ASCII 0-9
    }
    [DllImport("kernel32.dll")]
    static extern int FoldString(int dwMapFlags, string lpSrcStr, int cchSrc,
       [Out] StringBuilder lpDestStr, int cchDest);

    public static string RemoveDiacritics1(string stIn)
    {
        StringBuilder sb = new StringBuilder();
        FoldString((int)MapFlags.MAP_COMPOSITE, stIn, stIn.Length, sb, stIn.Length * 2);
        return Regex.Replace(sb.ToString(), @"\p{Sk}", "");
    }
    #endregion

    #region Utilizando parte del código de VietPad
    public static string RemoveDiacritics2(string strIn)
    {
        Normalizer n = new Normalizer(Normalizer.D);
        return Regex.Replace(n.normalize(strIn), "\p{Mn}+", "");
    }
    #endregion

    public static void Main(string[] args)
    {
        string str = "Canción";
        // Usando API de FoldString
        Console.WriteLine(RemoveDiacritics1(str));
        // Usando parte del código de VietPad (http://vietpad.sourceforge.net)
        Console.WriteLine(RemoveDiacritics2(str));
        Console.Read();
    }
}

Nota1: Por alguna extraña razón, al compilar desde Visual Studio 2003 no funciona bien el ejemplo cuando
se usa FoldString, pero si se compila desde la línea de comandos no hay ningún problema

Nota2: No he probado el funcionamiento del código en Mono para Windows.

Archivos Relacionados

Categories
.NET

Visual Studio 2005 en español

Leo en el blog de Jose Luis Manners que ya está disponible la versión en español de Visual Studio 2005 para los que cuentan con suscripción a MSDN.

Categories
.NET ASP.NET

Eliminando acentos con .NET 2

Intentando simular —en un pequeño gestor de noticias que estoy desarrollando— la forma como WordPress elimina los acentos de los títulos de las entradas (ver función remove_accents en wp-includes/functions-formatting.php), para que las URL se vean sin problemas y mejoren el posicionamiento del sitio, encontré una referencia muy útil para hacer esa tarea de una manera sencilla usando .NET Framework 2:

csharp:

static string UrlSanitize(string url)
{
        url = Regex.Replace(url, @"\s+", "-");
        string stFormD = url.Normalize(NormalizationForm.FormD);
        StringBuilder sb = new StringBuilder();
 
        for (int ich = 0; ich < stFormD.Length; ich++)
        {
                UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]);
                if (uc != UnicodeCategory.NonSpacingMark)
                {
                        sb.Append(stFormD[ich]);
                }
        }
 
        return (sb.ToString());
}
Categories
.NET Varios

Error en compilador de mono para VB.NET

Si bien es cierto que este compilador tpdavía está en fase alpha, falla con el siguiente ejemplo:

vbnet:

Imports System

Public Class Foo
        Public Shared Sub Main()
                Dummy(Console.WriteLine())
        End Sub
        Public Shared Sub Dummy(ByVal x as String)
        End Sub
End Class

Como saben, el código mostrado inicialmente no debería compilar, sabiendo que el método WriteLine de la clase Console, no devuelve nada.

Observando el IL generado para el método Main, hay alguna pista del porque se compila sin problemas

code:

// method line 2
    .method public static
           default void Main ()  cil managed
    {
        // Method begins at RVA 0x2100
        .entrypoint
        // Code size 21 (0x15)
        .maxstack 3
        .locals init (
                object[]        V_0,
                string[]        V_1,
                bool[]  V_2)
        IL_0000:  call void class [mscorlib]System.Console::WriteLine()
        IL_0005:  box [mscorlib]System.Void
        IL_000a:  call string class [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.StringType::FromObject(object)
        IL_000f:  call void class Foo::Dummy(string)
        IL_0014:  ret
    } // end of method Foo::default void Main ()

No soy ningún experto en IL, pero al parecer hace un boxing del tipo System.Void a un objecto (me parece que ahí­ es donde debería mandar el error de compilación)y luego intenta convertir ese objeto a un string.

Estuve intentando determinar donde exáctamente se produce este error, pero sin resultados satisfactorios :(, por lo pronto sólo he reportado el bug.