2010-01-31 15 views
12

Estoy tratando de traducir el siguiente método slugify desde PHP a C#: http://snipplr.com/view/22741/slugify-a-string-in-php/slugify y transliteración de caracteres en C#

Editar: Por razones de conveniencia, aquí el código de arriba:

/** 
* Modifies a string to remove al non ASCII characters and spaces. 
*/ 
static public function slugify($text) 
{ 
    // replace non letter or digits by - 
    $text = preg_replace('~[^\\pL\d]+~u', '-', $text); 

    // trim 
    $text = trim($text, '-'); 

    // transliterate 
    if (function_exists('iconv')) 
    { 
     $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text); 
    } 

    // lowercase 
    $text = strtolower($text); 

    // remove unwanted characters 
    $text = preg_replace('~[^-\w]+~', '', $text); 

    if (empty($text)) 
    { 
     return 'n-a'; 
    } 

    return $text; 
} 

no tengo probleming el resto de codificación excepto que no puedo encontrar el equivalente C# de la siguiente línea de código PHP:

$text = iconv('utf-8', 'us-ascii//TRANSLIT', $text); 

Editar: propósito de esto es traducir los caracteres no ASCII como Reformáció Genfi Emlékműve Előtt en reformacio-genfi-emlekmuve-elott

+0

¿Te importa publicar la solución final para poder verla? – chakrit

Respuesta

11

También me gustaría añadir que el //TRANSLIT elimina los apóstrofes y esa solución @jxac no se refiere a eso. No estoy seguro de por qué, pero primero codificándolo en cirílico y luego en ASCII obtienes un comportamiento similar al //TRANSLIT.

var str = "éåäöíØ"; 
var noApostrophes = Encoding.ASCII.GetString(Encoding.GetEncoding("Cyrillic").GetBytes(str)); 

=> "eaaoiO" 
+0

¡Muchas gracias por esta solución! He estado buscando una manera de reemplazar los caracteres no estadounidenses de ASCII con un equivalente ASCII para un viejo sistema de mainframe que no puede manejar estos caracteres. – Annagram

+0

Scary! Pero funciona. –

+0

Esto simplemente elimina los acentos y no hace la transliteración real. Perderá todas las letras sin acentos en el proceso. –

1

conversión a la cadena:

byte[] unicodeBytes = Encoding.Unicode.GetBytes(str); 
byte[] asciiBytes = Encoding.Convert(Encoding.Unicode, Encoding.ASCII, unicodeBytes); 
string asciiString = Encoding.ASCII.GetString(asciiBytes); 

conversión a bytes:

byte[] ascii = Encoding.ASCII.GetBytes(str); 

@Thomas Levesque i s derecha, obtendrá codificada por la secuencia de salida ...

para eliminar los signos diacríticos (tildes), que puede utilizar la función String.Normalize, como se detalla aquí:

http://www.siao2.com/2007/05/14/2629747.aspx

que debe ocúpese de la mayoría de los casos (donde el glifo es realmente un personaje más un acento). para una coincidencia de carbón aún más agresivo (cuidar de los casos como los escandinavos slashed o [o], dígrafos, y otros glifos exóticas), está el enfoque de tabla:

http://www.codeproject.com/KB/cs/UnicodeNormalization.aspx

esto incluye alrededor de 1.000 asignaciones de símbolos en Además de la normalización.

(nota, todos los puntuacion se elimina por la expresión regular reemplazar en su ejemplo)

8

Hay una biblioteca .NET para la transliteración en CodePlex - unidecode. Generalmente hace el truco usando tablas Unidecode portadas desde Python.

+0

Ahora también está en NuGet: https://www.nuget.org/packages/UnidecodeSharpFork/ – skolima