2010-01-31 12 views
12

Próbuję tłumaczyć następujące slugify metodę z PHP do C#: http://snipplr.com/view/22741/slugify-a-string-in-php/Slugify i Transliteracja znaków w języku C#

Edit: Dla wygody, tutaj kod z góry:

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

mam nie probleming kodowania resztę z wyjątkiem nie mogę znaleźć C# odpowiednik następującej linii kodu PHP:

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

Edit: Cel ten jest przełożenie znaków spoza ASCII, takie jak Reformáció Genfi Emlékműve Előtt do reformacio-genfi-emlekmuve-elott

+0

Czy myślisz o opublikowaniu gotowego rozwiązania, więc mógłbym rzucić okiem? – chakrit

Odpowiedz

11

Chciałbym również dodać, że //TRANSLIT usuwa apostrof i że rozwiązanie @jxac nie rozwiązuje to. Nie jestem pewien dlaczego, ale najpierw kodując go cyrylicą, a następnie ASCII, otrzymujesz podobne zachowanie, jak //TRANSLIT.

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

=> "eaaoiO" 
+0

Dziękuję bardzo za to rozwiązanie! Szukałem sposobu na zastąpienie znaków spoza US-ASCII odpowiednikiem ASCII dla starego systemu mainframe, który nie może obsłużyć tych znaków. – Annagram

+0

Straszny! Ale działa. –

+0

Po prostu usuwa akcenty i nie wykonuje rzeczywistej transliteracji. Spowoduje to utratę wszystkich nieakcentowanych liter w procesie. –

1

konwersja do napisu:

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

konwersja bajtów:

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

@Thomas Levesque i prawda, dostanie kodowane przez strumienia wyjściowego ...

usunąć znaki diakrytyczne (znaki akcentu), można użyć funkcji String.Normalize, jak opisano tutaj:

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

że powinien zajmij się większością spraw (gdzie glif jest naprawdę postacią i znakiem akcentu). na jeszcze bardziej agresywny dopasowywania char (dbać o przypadkach jak skandynawskich slashed o [o] digrafach i innych egzotycznych glifów), nie jest to podejście tabela:

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

ten obejmuje około 1000 odwzorowania symbolu w dodatek do normalizacji.

(uwaga, wszystkie znaki interpunkcyjne jest usuwany przez regex zastąpić w przykładzie)

8

Istnieje biblioteka .NET dla transliteracji na CodePlex - unidecode. Zwykle robi to za pomocą tabel Unidecode przeniesionych z Pythona.

+0

Teraz jest również na NuGet: https://www.nuget.org/packages/UnidecodeSharpFork/ – skolima

Powiązane problemy