C# 中的 Slugify 和字符转写

Posted

技术标签:

【中文标题】C# 中的 Slugify 和字符转写【英文标题】:Slugify and Character Transliteration in C# 【发布时间】:2011-01-11 13:01:55 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

=> "eaaoiO"

【讨论】:

非常感谢这个解决方案!对于无法处理这些字符的旧大型机系统,我一直在寻找一种方法来用 ASCII 等效字符替换非 US-ASCII 字符。 这只是去除了重音,并没有进行实际的音译。它会在此过程中丢失所有非重音字母。 我不确定您所说的实际音译是什么意思,但它肯定不会删除非重音字母。 Reformáció Genfi Emlékműve Előtt => Reformacio Genfi Emlekmuve Elott "Привет" 但是变成了一个空字符串。这就是我所说的,它会丢弃非重音非拉丁字母。在您的示例中,它仅删除了重音符号,其余字母已经是拉丁语,因此不会发生音译。【参考方案2】:

codeplex 上有一个用于音译的 .NET 库 - unidecode。它通常使用从 python 移植的 Unidecode 表来解决问题。

【讨论】:

【参考方案3】:

转换成字符串:

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 个符号映射。

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

【讨论】:

以上是关于C# 中的 Slugify 和字符转写的主要内容,如果未能解决你的问题,请参考以下文章

PHP 在PHP中使用Slugify字符串

在PHP中对字符串进行Slugify

php PHP的简单slugify功能。为传递的字符串创建一个slug,同时考虑国际字符。

django slugify 俄语字符串 [重复]

C# 调用科大讯飞语音转写接口上传音频文件转文字可直接用

如何在保持 UTF-8 字母的同时进行 slugify [重复]