C#中的Slugify和字符音译

时间:2010-01-31 23:18:23

标签: c# internationalization slug transliteration

我正在尝试将以下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);

编辑: 其目的是将Reformáció Genfi Emlékműve Előtt等非ASCII字符转换为reformacio-genfi-emlekmuve-elott

3 个答案:

答案 0 :(得分:10)

我还想补充说//TRANSLIT删除了撇号,@ jxac解决方案没有解决这个问题。我不确定为什么,但首先将其编码为Cyrillic然后再编码为ASCII,您会得到与//TRANSLIT类似的行为。

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

=> "eaaoiO"

答案 1 :(得分:9)

在codeplex上有一个用于音译的.NET库 - unidecode。它通常使用从python移植的Unidecode表来实现。

答案 2 :(得分: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

应该处理大多数情况(字形实际上是字符加上重音符号)。对于更具侵略性的字符匹配(处理斯堪的纳维亚slashed o [Ø],有向图和其他异形字形等案例),有表格方法:

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

除了规范化之外,还包括大约1,000个符号映射。

(注意,在您的示例中,正则表达式替换删除了所有标点符号)