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őttreformacio-genfi-emlekmuve-elott

4

3 回答 3

14

我还想补充一点,//TRANSLIT删除撇号,@jxac 解决方案没有解决这个问题。我不知道为什么,但首先将其编码为 Cyrillic,然后再编码为 ASCII,您会得到与//TRANSLIT.

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

=> "eaaoiO"
于 2010-01-31T23:49:11.047 回答
9

在 codeplex- unidecode上有一个用于音译的 .NET 库。它通常使用从 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

这应该可以解决大多数情况(字形实际上是一个字符加上一个重音符号)。对于更激进的字符匹配(处理像斯堪的纳维亚斜线 o [Ø]、二合字母和其他外来字形这样的情况),有表格方法:

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

除了标准化之外,这还包括大约 1,000 个符号映射。

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

于 2010-01-31T23:36:13.337 回答