是否可以在.NET中显示(转换?)unicode hex \ u0092到unicode html实体?

时间:2017-09-13 00:38:09

标签: c# .net unicode

我有一些包含以下代码/值的字符串:

"You won\u0092t find a ...."

enter image description here

看起来该字符串包含Right Apostrophe特殊字符。

我不知道如何将这个显示给webbrowser。它会继续显示 TOFU 方框字符。我的印象是unicode(十六进制)值00092可以转换为unicode(html)’

我的理解是否正确?

更新1:

@ sam-ax建议我对unicode进行HtmlEncode。那没用。这是......

enter image description here

请注意ampersand已正确编码....

2 个答案:

答案 0 :(得分:4)

看起来有一种编码混淆。在.NET中,字符串通常编码为UTF-16,右撇号应表示为\u2019。但在您的示例中,右撇号表示为\x92,表示原始编码为Windows code page 1252。如果在Unicode文档中包含字符串,则无法正确解释字符\x92

您可以通过将字符串重新编码为UTF-16来解决问题。为此,请将字符串视为字节数组,然后使用1252代码页将字节转换回Unicode:

string title = "You won\u0092t find a cheaper apartment * Sauna & Spa";
byte[] bytes = title.Select(c => (byte)c).ToArray();
title = Encoding.GetEncoding(1252).GetString(bytes);
// Result: "You won’t find a cheaper apartment * Sauna & Spa"

答案 1 :(得分:1)

注意:我的答案很大程度上是基于猜测和查看System.Web 4.0的反编译代码。参考源看起来非常相似(相同?)。

您是正确的,可以在浏览器中显示read(ByteBuffer src)(6个字符)。但是,输出字符串包含"’"(1个字符)。这是一个控制字符,而不是HTML实体。

根据reference code"\u0092"不会转换128到160之间的字符 - 此范围内的所有字符都是控制字符(&符号在代码中是特殊的,因为其他一些特殊字符HTML符号)。

我的 guess 是因为这些是控制字符,所以它们在没有转换的情况下输出,因为转换它会改变字符串的含义。 (我尝试使用LinqPad运行一些示例,但未呈现此角色。)

如果你真的想要转换这些字符(或删除它们),你可能必须在调用WebUtility.HtmlEncode()之前/之后编写自己的函数 - 可能有一些事情已经这样做了但我没有知道任何。

希望这有帮助。

编辑: Michael Liu的回答似乎是正确的。我在这里留下我的答案,因为它在字符串的输入编码未知时可能很有用。