如何将 UTF-8 字符转换为 ASCII 以在 URL 中使用?

KRT*_*Tac 2 .net c# asp.net dotnetnuke

我想自动转换 UTF-8 字符â Ù á ? ?a U a C G以便它们在 URL 中是可以接受的。

到目前为止,我有这个:

Encoding sourceEncoding = Encoding.GetEncoding(28591); // ISO-8859-1

byte[] asciiBytes = Encoding.Convert(sourceEncoding, Encoding.ASCII, sourceEncoding.GetBytes(<source text>));

String asciiString = Encoding.UTF8.GetString(asciiBytes);
Run Code Online (Sandbox Code Playgroud)

这种方法有两个问题:

  1. 这适用于某些字符(? 和 ?),但对于其他字符(â、Ù、á),它会返回一个问号代替该字符。
  2. 整个站点使用 UTF-8,而不是 ISO-8859-1,但是当我将 sourceEncoding 设置为 Encoding.UTF8 时,所有字符都转换为问号,因此它根本不起作用。

有什么想法可以让我完成这项工作吗?

Mar*_*erl 5

您可以最好使用normalization去除变音符号(通常称为重音符号,您知道:波浪号、cédille、元音变音和朋友)。

以下方法应替换 99% 的所有变音符号。然而,最后一个百分比仍将显示为 ?。如果您不想看到 ? 字符,使用此方法后用空字符串替换它们。

public static string RemoveDiacritics(string value)
{
    if (String.IsNullOrEmpty(value))
        return value;

    string normalized = value.Normalize(NormalizationForm.FormD);
    StringBuilder sb = new StringBuilder();

    foreach (char c in normalized)
    {
        if (System.Globalization.CharUnicodeInfo.GetUnicodeCategory(c) != System.Globalization.UnicodeCategory.NonSpacingMark)
            sb.Append(c);
    }

    Encoding nonunicode = Encoding.GetEncoding(850);
    Encoding unicode = Encoding.Unicode;

    byte[] nonunicodeBytes = Encoding.Convert(unicode, nonunicode, unicode.GetBytes(sb.ToString()));
    char[] nonunicodeChars = new char[nonunicode.GetCharCount(nonunicodeBytes, 0, nonunicodeBytes.Length)];
    nonunicode.GetChars(nonunicodeBytes, 0, nonunicodeBytes.Length, nonunicodeChars, 0);

    return new string(nonunicodeChars);
}
Run Code Online (Sandbox Code Playgroud)

希望有帮助!