带有重音/变音符的c# UserPrincipalName

本文关键字:音符 UserPrincipalName | 更新日期: 2023-09-27 18:13:12

在MVC应用程序的某些地方,我对Active Directory进行搜索以获得包含该模式的用户帐户。问题是,在我的公司,一些用户在他们的UserPrincipalName上有口音/变音符号,当我使用口音进行搜索时,这些用户不存在。但是如果我不带重音进行搜索,应用程序就会找到这些用户。

我已经尝试将字符串转换为Unicode,但不工作。我用了这个,这个,这个和其他一些我找不到的。

public static List<string> SearchUsername(string __Pattern)
    {
        __Pattern = __Pattern.Normalize(NormalizationForm.FormD);
        var chars = __Pattern.Where(c => CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark).ToArray();
        __Pattern =  new string(chars).Normalize(NormalizationForm.FormC);
        List<string> Result = new List<string>();
        PrincipalContext Ldap = new PrincipalContext(ContextType.Domain, ConfigurationManager.AppSettings["LdapConnection"]);
        UserPrincipal User = new UserPrincipal(Ldap);
        User.UserPrincipalName = __Pattern + "*@cebi.org.pt";
        PrincipalSearcher Search = new PrincipalSearcher(User);
        foreach (var UserFound in Search.FindAll())
        {
            Result.Add(UserFound.UserPrincipalName.ToString().Split('@').First());
        }
        return Result;
    }

带有重音/变音符的c# UserPrincipalName

该链接包含的解决方案很少,有些忽略了不同语言中使用的几个字符。

下面的代码是其中一个答案中的一个,即使它没有被签名为正确答案,似乎也能更好地工作。

string accentedStr;
byte[] tempBytes;
tempBytes = System.Text.Encoding.GetEncoding("ISO-8859-8").GetBytes(accentedStr);
string asciiStr = System.Text.Encoding.UTF8.GetString(tempBytes);

这是通过转换缺少重音字符的Hebrew Unicode的文本,并将其编码回UTF8来完成的。

试试这个方法是否适合你的字符集。