我需要一个c#/ .net中的方法,它可以将任意字符串(包含许多奇怪的字符)作为输入,并生成一个尽可能接近输入的有效子域。
实施例: 输入:Øyvind& René有限公司 输出:oyvindrenescompanyltd.example.com
是否有人知道可以帮助我进行此转换的.net库?
很容易删除子域中无效的所有字符,但是如果我必须替换很多字符(ø - > o,é - > e),那么捕获所有变体并非易事。 / p>
答案 0 :(得分:2)
但如果我必须更换很多字符(ø - > 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框架,而不适用于Windows Phone,WinRT或Silverlight)
答案 1 :(得分:1)
您可以使用Unidecode
,Perl模块的同名端口(或者您可以使用Thomas Levesque发布的RemoveDiacritics
方法):
using BinaryAnalysis.UnidecodeSharp;
using System.Text.RegularExpressions;
public static string MakeSubdomain(string rawSubdomain, string baseDomain)
{
if (baseDomain.Length + 2 > 253) {
throw new ArgumentException("Base domain is already too long for a subdomain");
}
if (baseDomain.Length == 0) {
throw new ArgumentException("Invalid base domain");
}
var sub = rawSubdomain.Unidecode();
sub = Regex.Replace(sub, @"[^a-zA-Z0-9-]+", "");
sub = Regex.Replace(sub, @"(^-+)|(-+$)", "");
sub = sub.ToLowerInvariant();
if (sub.Length > 63) {
sub = sub.Substring(0, 63);
}
if (sub.Length + baseDomain.Length + 1 > 253) {
sub = sub.Substring(0, 252 - baseDomain.Length);
}
return sub + "." + baseDomain;
}