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 和字符转写的主要内容,如果未能解决你的问题,请参考以下文章