HTML 在 C# 中编码 ISO-8859-2(拉丁语-2)字符



>有人知道如何在 C# 中编码 ISO-8859-2 字符集吗?以下示例不起作用:

        String name = "Filipović";
        String encoded = WebUtility.HtmlEncode(name);

生成的字符串应为

"Filipović"

谢谢

如果您对 Html 编码没有严格的要求,我建议您使用 Url (%( 编码来编码所有非 ASCII 字符:

String name = "Filipović";
String encoded = WebUtility.UrlEncode(name); // Filipovi%C4%87

如果必须具有所有非 ASCII 字符的字符串才能进行一致的 HTML 编码,则最好的选择是使用&xNNNN;&#NNNN;格式对所有超过 127 的字符进行编码。不幸的是,没有办法方便HtmlEncode对所有字符进行编码,因此您需要自己执行此操作,即类似地将 Unicode 字符串转换为转义的 ASCII 字符串。您可以继续使用 HtmlDecode 在它处理&#xNNNN处读取值。

非最佳样本:

  var name = "Filipović";
  var result = String.Join("", 
     name.Select(x => x < 127 ? x.ToString() : String.Format("&#x{0:X4}", (int)x))
  );

阅读您的评论后(您也应该仅支持使用 ASCII 字符的中文名称(,我认为您不应该坚持 ISO-8859-2 编码。

解决方案 1

对此类名称使用 UTF-7 编码。UTF-7 旨在仅对任何 Unicode 字符串使用 ASCII 字符。

string value = "Filipović with Unicode symbol: 🏯";
var encoded = Encoding.ASCII.GetString(Encoding.UTF7.GetBytes(value));
Console.WriteLine(encoded); // Filipovi+AQc- with Unicode symbol: +2Dzf7w-
var decoded = Encoding.UTF7.GetString(Encoding.ASCII.GetBytes(encoded));

解决方案 2

或者,您也可以使用 base64 编码。但在这种情况下,纯 ASCII 字符串将不再是人类可读的。

string value = "Filipović with Unicode symbol: 🏯";
encoded = Convert.ToBase64String(Encoding.UTF8.GetBytes(value));
Console.WriteLine(encoded); // RmlsaXBvdmnEhyB3aXRoIFVuaWNvZGUgc3ltYm9sOiDwn4+v
var decoded = Encoding.UTF8.GetString(Convert.FromBase64String(encoded));

解决方案 3

如果你真的坚持HTML实体编码,你可以像这样实现它:

string value = "Filipović with Unicode symbol: 🏯";
var result = new StringBuilder();       
for (int i = 0; i < value.Length; i++)
{
    if (Char.IsHighSurrogate(value[i]))
    {
        result.Append($"&#{Char.ConvertToUtf32(value[i], value[i + 1])};");
        i++;
    }
    else if (value[i] > 127)
        result.Append($"&#{(int)value[i]};");
    else
        result.Append(value[i]);
}
Console.WriteLine(result); // Filipovi&#263; with Unicode symbol: &#127983;

最新更新