我正在尝试将以下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
答案 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个符号映射。
(注意,在您的示例中,正则表达式替换删除了所有标点符号)