SourceForge是如何破坏这个Unicode字符的?

时间:2011-03-13 17:28:50

标签: unicode encoding utf-8 character-encoding

为您编写一个小编码拼图。

对SourceForge跟踪器项的评论包含角色U+2014,EM DASH,由网络界面呈现为,就像它应该的那样。

然而,在XML导出中,它显示为:

—

解码导致这些代码点的实体:

U+00E2 U+20AC U+201D

即。字符—。 XML应该是—,十进制表示为0x2014,所以这可能是SF.net导出器中的一个错误。

现在我正在寻求改变这个过程,但无论我尝试什么错误的编码/解码序列,我找不到从这个Unicode字符获得上述输出的方法。知道这里发生了什么以及如何扭转这个过程吗?

2 个答案:

答案 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代码点将字符保存为三个单独的实体。