为您编写一个小编码拼图。
对SourceForge跟踪器项的评论包含角色U+2014,EM DASH,由网络界面呈现为—
,就像它应该的那样。
然而,在XML导出中,它显示为:
—
解码导致这些代码点的实体:
U+00E2 U+20AC U+201D
即。字符—
。 XML应该是—
,十进制表示为0x2014,所以这可能是SF.net导出器中的一个错误。
现在我正在寻求改变这个过程,但无论我尝试什么错误的编码/解码序列,我找不到从这个Unicode字符获得上述输出的方法。知道这里发生了什么以及如何扭转这个过程吗?
答案 0 :(得分:4)
使用CP1252错误地编码了XML输出。要恢复此功能,请使用CP1252编码将—
转换为字节,然后使用UTF-8编码将这些字节转换回字符串/字符。
基于Java的证据:
String s = "—";
System.out.println(new String(s.getBytes("CP1252"), "UTF-8")); // —
请注意,这假定stdout控制台本身使用UTF-8来显示字符。
答案 1 :(得分:1)
在.Net中,Encoding.UTF8.GetString(Encoding.GetEncoding(1252).GetBytes("—"))
会返回—
。
SourceForge将其转换为UTF8,将每个字节解释为CP1252中的字符,然后使用这些字符的实际Unicode代码点将字符保存为三个单独的实体。