Слагификация и транслитерация символов в C # - PullRequest
12 голосов
/ 01 февраля 2010

Я пытаюсь перевести следующий метод 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;
}

У меня нет проблем с кодированием, за исключением того, что я не могу найти эквивалент C # следующей строки кода PHP:

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

Редактировать: Целью этого является перевод не-ASCII символов, таких как Reformáció Genfi Emlékműve Előtt, в reformacio-genfi-emlekmuve-elott

Ответы [ 3 ]

10 голосов
/ 01 февраля 2010

Я также хотел бы добавить, что //TRANSLIT удаляет апострофы, а решение @jxac не решает эту проблему. Я не уверен, почему, но сначала кодируя его в кириллицу, а затем в ASCII, вы получаете поведение, подобное //TRANSLIT.

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

=> "eaaoiO"
9 голосов
/ 15 июля 2010

. В codeplex есть библиотека .NET для транслитерации - unidecode . Обычно это делается с помощью таблиц Unidecode, портированных из python.

1 голос
/ 01 февраля 2010

преобразование в строку:

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);

@ Томас Левеск прав, будет закодирован выходным потоком ...

чтобы удалить диакритические знаки (знаки ударения), вы можете использовать функцию String.Normalize, как подробно описано здесь:

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

, который должен позаботиться о большинстве случаев (когда глиф - это действительно символ плюс знак акцента). для еще более агрессивного сопоставления символов (чтобы позаботиться о таких случаях, как скандинавская косая черта o [Ø], орграфы и другие экзотические глифы), существует табличный подход:

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

включает в себя около 1000 сопоставлений символов в дополнение к нормализации.

(обратите внимание, все знаки препинания удаляются регулярным выражением замены в вашем примере)

...