12

次のslugifyメソッドをPHPからC#に変換しようとしています: http ://snipplr.com/view/22741/slugify-a-string-in-php/

編集:便宜上、ここに上記のコードを示します。

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

次のPHPコード行に相当するC#が見つからないことを除いて、残りのコーディングに問題はありませんでした。

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

編集: これの目的は、次のような非ASCII文字を翻訳するReformáció Genfi Emlékműve Előttことreformacio-genfi-emlekmuve-elott

4

3 に答える 3

14

また//TRANSLIT、アポストロフィが削除され、@jxacソリューションがそれに対処していないことも付け加えておきます。理由はわかりませんが、最初にキリル文字にエンコードしてからASCIIにエンコードすると、と同様の動作が得られ//TRANSLITます。

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

=> "eaaoiO"
于 2010-01-31T23:49:11.047 に答える
9

codeplexで音訳するための.NETライブラリがあります-unidecode。これは通常、Pythonから移植されたUnidecodeテーブルを使用してトリックを実行します。

于 2010-07-15T13:18:34.290 に答える
1

文字列への変換:

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

バイトへの変換:

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

@Thomas Levesqueは正しいです、出力ストリームによってエンコードされます...

発音区別符号(アクセント記号)を削除するには、String.Normalize関数を使用できます。詳細は次のとおりです。

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

ほとんどの場合はこれで対処できます(グリフが実際には文字とアクセント記号である場合)。さらに積極的なcharマッチング(スカンジナビアのスラッシュo [Ø]、有向グラフ、およびその他のエキゾチックなグリフなどのケースを処理するため)には、テーブルアプローチがあります。

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

これには、正規化に加えて、約1,000のシンボルマッピングが含まれます。

(例では、すべての句読点は正規表現置換によって削除されていることに注意してください)

于 2010-01-31T23:36:13.337 に答える