2010-01-31 10 views
12

Ich versuche, die folgende slugify Methode von PHP in C# zu übersetzen: http://snipplr.com/view/22741/slugify-a-string-in-php/Slugify und Charakter Transkription in C#

Edit: Aus Gründen der Bequemlichkeit, hier den Code von oben:

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

ich habe keine probleming den Rest Codierung außer ich nicht das C# Äquivalent der folgenden Zeile PHP-Code finden:

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

Edit: Zweck ist, nicht-ASCII-Zeichen wie Reformáció Genfi Emlékműve Előtt in reformacio-genfi-emlekmuve-elott

+0

Macht es Ihnen etwas aus, die fertige Lösung zu posten, damit ich sie mir ansehen kann? – chakrit

Antwort

11

Ich möchte auch hinzufügen, dass die //TRANSLIT die Apostrophe entfernt und dass @jxac Lösung nicht, dass adressieren. Ich bin nicht sicher, warum, aber indem Sie es zuerst zu kyrillisch und dann zu ASCII kodieren, erhalten Sie ein ähnliches Verhalten wie //TRANSLIT.

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

=> "eaaoiO" 
+0

Vielen Dank für diese Lösung! Ich habe nach einer Möglichkeit gesucht, Nicht-US-ASCII-Zeichen durch ein ASCII-Äquivalent für ein altes Mainframe-System zu ersetzen, das diese Zeichen nicht verarbeiten kann. – Annagram

+0

Furchtsam! Aber es funktioniert. –

+0

Dies entfernt nur Akzente und führt keine eigentliche Transliteration durch. Es wird alle nicht akzentuierten Buchstaben in dem Prozess verlieren. –

1

Umwandlung in String zu übersetzen:

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

Umwandlung in Bytes:

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

@Thomas Levesque i Recht wird durch den Ausgangsstrom codiert bekommen ...

die diakritischen Zeichen (Akzentzeichen) zu entfernen, können Sie die String.Normalize Funktion verwenden, wie hier beschrieben:

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

das sollte achte auf die meisten Fälle (wo die Glyphe wirklich ein Zeichen plus eine Akzentmarke ist). für eine noch aggressivere char Anpassung (Pflege von Fällen wie den skandinavischen slashed o [Ø], Digraphen, und andere exotische Glyphen zu nehmen), dann ist es die Tabelle Ansatz:

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

dies rund 1.000 Symbol-Zuordnungen enthält in Neben der Normalisierung.

(beachten Sie, wird alle Interpunktion durch die regex entfernt in Ihrem Beispiel ersetzen)

8

Es ist eine .NET-Bibliothek für die Umschrift auf Codeplex - unidecode. Es macht im Allgemeinen den Trick mit Unidecode-Tabellen portiert von Python.

+0

Es ist jetzt auch auf NuGet: https://www.nuget.org/packages/UnidecodeSharpFork/ – skolima