HTML在C#中编码ISO-8859-2(Latin-2)字符

时间:2017-06-29 16:12:28

标签: c# character-encoding

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

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

结果字符串应为

"Filipović"

由于

2 个答案:

答案 0 :(得分:1)

阅读完你的评论后(你也应该只支持使用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;

答案 1 :(得分:1)

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

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

如果您必须将包含所有非ASCII字符的字符串一致地进行HTML编码,那么最好的选择是使用&xNNNN;&#NNNN; format来编码127以上的所有字符。不幸的是,有无法让HtmlEncode对所有字符进行编码,因此您需要自己完成,即类似于Convert a Unicode string to an escaped ASCII string中的方式。您可以继续使用HtmlDecode来回读它处理&#xNNNN的值。

非最佳样本:

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