2010-01-31 7 views
12

Je suis en train de traduire la méthode slugify suivante de PHP à C#: http://snipplr.com/view/22741/slugify-a-string-in-php/slugify et translittération de caractères en C#

Edit: Pour des raisons de commodité, voici le code de ci-dessus:

/** 
* 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; 
} 

J'ai pas probleming coder le reste, sauf que je ne trouve pas le C# équivalent de la ligne suivante de code PHP:

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

Edit: but est de traduire des caractères non-ASCII tels que Reformáció Genfi Emlékműve Előtt dans reformacio-genfi-emlekmuve-elott

+0

Cela vous dérange-t-il d'afficher la solution finie pour que je puisse y jeter un coup d'œil? – chakrit

Répondre

11

Je voudrais également ajouter que la //TRANSLIT supprime les Apostrophes et que la solution de @jxac ne répond pas. Je ne sais pas pourquoi mais en le codant d'abord en cyrillique puis en ASCII vous obtenez un comportement similaire à //TRANSLIT.

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

=> "eaaoiO" 
+0

Merci beaucoup pour cette solution! J'ai cherché un moyen de remplacer les caractères non US-ASCII avec un équivalent ASCII pour un ancien système mainframe qui ne peut pas gérer ces caractères. – Annagram

+0

Effrayant! Mais ça fonctionne. –

+0

Cela supprime simplement les accents et ne fait pas de translittération réelle. Il perdra toutes les lettres non accentuées dans le processus. –

1

conversion en chaîne:

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

conversion en octets:

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

@Thomas Levesque i s droite, va obtenir codé par le flux de sortie ...

pour enlever les diacritiques (marques d'accent), vous pouvez utiliser la fonction String.Normalize, comme indiqué ici:

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

qui devrait prendre soin de la plupart des cas (où le glyphe est vraiment un caractère plus une marque d'accent). pour une mise en correspondance char encore plus agressif (pour prendre en charge des cas comme les slashed o scandinaves [Ø], digraphs et autres Glyphes exotiques), il y a l'approche de la table:

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

cela inclut environ 1.000 correspondances de symboles dans plus à la normalisation.

(note, la ponctuation est enlevée par la regex dans votre exemple remplacerai)

8

Il existe une bibliothèque .NET pour la translittération sur codeplex - unidecode. Il fait généralement l'affaire en utilisant des tables Unidecode portées à partir de python.

+0

Il est maintenant aussi sur NuGet: https://www.nuget.org/packages/UnidecodeSharpFork/ – skolima