任何人都知道如何在C#中编码ISO-8859-2字符集?以下示例不起作用:
String name = "Filipović";
String encoded = WebUtility.HtmlEncode(name);
结果字符串应为
"Filipović"
由于
答案 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ć with Unicode symbol: 🏯
答案 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))
);