C# 将任何字符串转换为有效的DNS子域
我需要一个c#/.net中的方法,该方法可以将任何包含大量奇怪字符的字符串作为输入,并生成一个尽可能接近输入的有效子域 例如: 输入:Øyvind&Renés有限公司。 输出:oyvindrenescompanyltd.example.com 有谁知道有一个.net库可以帮助我进行这种转换 删除子域中所有无效的字符很容易,但是如果我必须替换很多字符(ø->o,é->e),那么捕获所有的变体也不是件小事 但是如果我必须替换很多字符(ø->o,é->e),那么捕获所有的变化并不是件小事 实际上,通过利用Unicode规范化,删除变音字符(重音等)非常容易:C# 将任何字符串转换为有效的DNS子域,c#,.net,C#,.net,我需要一个c#/.net中的方法,该方法可以将任何包含大量奇怪字符的字符串作为输入,并生成一个尽可能接近输入的有效子域 例如: 输入:Øyvind&Renés有限公司。 输出:oyvindrenescompanyltd.example.com 有谁知道有一个.net库可以帮助我进行这种转换 删除子域中所有无效的字符很容易,但是如果我必须替换很多字符(ø->o,é->e),那么捕获所有的变体也不是件小事 但是如果我必须替换很多字符(ø->o,é->e),那么捕获所有的变化并不是件小事 实际上,通过
public static string RemoveDiacritics(this string s)
{
if (s == null) throw new ArgumentNullException("s");
string formD = s.Normalize(NormalizationForm.FormD);
char[] chars = new char[formD.Length];
int count = 0;
foreach (char c in formD)
{
if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
{
chars[count++] = c;
}
}
string noDiacriticsFormD = new string(chars, 0, count);
return noDiacriticsFormD.Normalize(NormalizationForm.FormC);
}
(请注意,它仅适用于完整的.NET framework,而不适用于Windows Phone、WinRT或Silverlight)
但是如果我必须替换很多字符(ø->o,é->e),那么捕获所有的变化并不是件小事
实际上,通过利用Unicode规范化,删除变音字符(重音等)非常容易:
public static string RemoveDiacritics(this string s)
{
if (s == null) throw new ArgumentNullException("s");
string formD = s.Normalize(NormalizationForm.FormD);
char[] chars = new char[formD.Length];
int count = 0;
foreach (char c in formD)
{
if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
{
chars[count++] = c;
}
}
string noDiacriticsFormD = new string(chars, 0, count);
return noDiacriticsFormD.Normalize(NormalizationForm.FormC);
}
(请注意,它仅适用于完整的.NET framework,而不适用于Windows Phone、WinRT或Silverlight)您可以使用同名Perl模块的端口(或者您可以使用Thomas Levesque发布的RemoveDiacritics
方法):
您可以使用相同名称的Perl模块的端口(或者您可以使用Thomas Levesque发布的RemoveDiacritics
方法):
你有没有考虑过国际化域名,或者只是问一下用户?一旦您想要支持不使用基于拉丁语的脚本的语言,自动转换就变得非常困难。相关:请看一看,这是Perl Unidecode模块的一个端口,用于将非拉丁语字符转换为拉丁语字符。无论如何,为了以防万一,最好在事后去掉所有剩余的无效字符。为什么替换比删除更简单呢?你知道“无效”的集合是什么吗?你还必须知道你想用什么有效值来替换……我缺少什么吗?@David:是的,仅仅因为你知道一个字符无效并不意味着你知道应该用什么来替换它。例如,'e'应该变成'e',但是有成千上万种可能的变音符号。。。构建查找表容易出错且耗时,而且可能会丢失字符——即使没有,也可能在某个时候过时。更不用说在Unicode中有几种表示变音字符的方法。你有没有考虑过国际化域名,或者只是问用户?一旦您想要支持不使用基于拉丁语的脚本的语言,自动转换就变得非常困难。相关:请看一看,这是Perl Unidecode模块的一个端口,用于将非拉丁语字符转换为拉丁语字符。无论如何,为了以防万一,最好在事后去掉所有剩余的无效字符。为什么替换比删除更简单呢?你知道“无效”的集合是什么吗?你还必须知道你想用什么有效值来替换……我缺少什么吗?@David:是的,仅仅因为你知道一个字符无效并不意味着你知道应该用什么来替换它。例如,'e'应该变成'e',但是有成千上万种可能的变音符号。。。构建查找表容易出错且耗时,而且可能会丢失字符——即使没有,也可能在某个时候过时。更不用说在Unicode中有几种表示变音字符的方法。谢谢,这是删除变音字符(é->e)的一个很好的解决方案,但它不包括其他必要的转换,如ø->o。我已经将Cameron的解决方案设置为使用Unidecode作为公认的答案,因为这涵盖了变音符号和其他字符转换,因此我认为这是一个更完整的解决方案。谢谢,这是一个删除变音符号(é->e)的好解决方案,但它不包括其他必要的转换,如ø->o。我已经将Cameron的解决方案设置为使用Unidecode作为公认的答案,因为这涵盖了变音符号和其他字符转换,因此我认为这是一个更完整的解决方案。