【问题标题】:How did SourceForge maim this Unicode character?SourceForge 是如何损坏这个 Unicode 字符的?
【发布时间】:2011-03-13 17:28:50
【问题描述】:

给你一个小编码难题。

对 SourceForge 跟踪器项目的评论包含字符 U+2014,EM DASH,它由 Web 界面呈现为 ,就像它应该的那样。

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

—

解码实体,产生这些代码点:

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

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

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

【问题讨论】:

    标签: unicode encoding utf-8 character-encoding


    【解决方案1】:

    XML 输出使用 CP1252 编码不正确。要恢复这种情况,请使用 CP1252 编码将 — 转换为字节,然后使用 UTF-8 编码将这些字节转换回字符串/字符。

    基于 Java 的证据:

    String s = "—";
    System.out.println(new String(s.getBytes("CP1252"), "UTF-8")); // —
    

    请注意,这假定标准输出控制台自己使用 UTF-8 来显示字符。

    【讨论】:

    • 基于 Python 的证据:u'\u2014'.encode('utf-8').decode('cp1252') 确实给出了u'\xe2\u20ac\u201d'。谢谢!
    【解决方案2】:

    在 .Net 中,Encoding.UTF8.GetString(Encoding.GetEncoding(1252).GetBytes("—")) 返回

    SourceForge 将其转换为 UTF8,将每个字节解释为 CP1252 中的字符,然后使用这些字符的实际 Unicode 代码点将字符保存为三个单独的实体。

    【讨论】:

    • 对不起,它没有签出。破折号的 UTF-8 编码是三个字节,但解码后的实体比这大。 Python:u'\u2014'.encode('utf-8') 给出了'\xe2\x80\x94',我不明白你是如何从那里到达我上面提到的三个代码点的。
    • @Thomas:在 .Net 中,Encoding.GetEncoding(1252).GetString(Encoding.UTF8.GetBytes("—")).Select(c => (int)c) 返回您的代码点。查看我的编辑。
    • 请注意,原来的答案使用了Encoding.Default
    猜你喜欢
    • 1970-01-01
    • 2014-11-26
    • 2021-06-01
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多