2010-01-31 17 views
12

PHP'den C# için aşağıdaki slugify yöntemi çevirmek çalışıyorum:Slugify ve C# Karakter Transliterasyon

: Burada kolaylık uğruna, yukarıdan kodu için: http://snipplr.com/view/22741/slugify-a-string-in-php/

Düzenleme

$text = iconv('utf-8', 'us-ascii//TRANSLIT', $text); 
:
/** 
* 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; 
} 

Ben PHP aşağıdaki kod satırının C# eşdeğer bulamıyorum dışında hiçbir dinlenme kodlama probleming var

Düzenleme: Bunun amacı ASCII olmayan karakterler çevirmek için böyle Reformáció Genfi Emlékműve Előtt dizeye dönüştürme

+0

Bitmiş çözümü göndermeyi umursamadan bir bakabilir miyim? – chakrit

cevap

11

Ben de //TRANSLIT kesme kaldırır ve bu @jxac çözümü ele etmediğini eklemek istiyorum (not, bütün noktalama sizin örnekte yerine normal ifade tarafından kaldırılır). Niçin emin değilim ama önce onu Kiriliğe ve daha sonra ASCII'ye kodlayarak //TRANSLIT ile benzer bir davranış elde edersiniz.

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

=> "eaaoiO" 
+0

Bu çözüm için çok teşekkürler! ABD-ASCII olmayan karakterleri, bu karakterleri işleyemeyen eski bir ana bilgisayar sistemi için ASCII eşdeğeriyle değiştirmenin bir yolunu aradım. – Annagram

+0

Korkunç! Ama işe yarıyor. –

+0

Bu sadece aksanları kaldırır ve gerçek transliterasyon yapmaz. Süreçte aksanlı olmayan tüm harfleri kaybedecek. –

1

reformacio-genfi-emlekmuve-elott içine gibidir:

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

dönüşüm bayt:

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

@Thomas Levesque i Burada ayrıntılı olarak doğru,

aksan işaretleri (aksan işaretleri), sen String.Normalize işlevini kullanabilirsiniz kaldırmak için ... çıkış akımına göre kodlanmış alacak:

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

o should vakaların çoğuna dikkat edin (glifin gerçekten bir karakter artı bir vurgu işareti olduğu yerde). Bu 1000 civarında sembol eşleştirmeleri içerir

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

: daha agresif karakter eşleştirme için (İskandinav slashed o [Ø], digraphs ve diğer egzotik glif gibi durumlarda dikkat çekmek için), masa yaklaşım vardır normalleşmeye ek.

8

Codeplex harf çevirisi için bir .NET kitaplığı var - unidecode. Genellikle python'dan taşınan Unidecode tablolarını kullanarak hile yapar.

+0

Artık NuGet'te de var: https://www.nuget.org/packages/UnidecodeSharpFork/ – skolima