将任何字符串转换为有效的DNS子域

时间:2013-09-02 15:52:21

标签: c# .net

我需要一个c#/ .net中的方法,它可以将任意字符串(包含许多奇怪的字符)作为输入,并生成一个尽可能接近输入的有效子域。

实施例: 输入:Øyvind& René有限公司 输出:oyvindrenescompanyltd.example.com

是否有人知道可以帮助我进行此转换的.net库?

很容易删除子域中无效的所有字符,但是如果我必须替换很多字符(ø - > o,é - > e),那么捕获所有变体并非易事。 / p>

2 个答案:

答案 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;
}