【问题标题】:Can't make Ant write proper version info with unicode (c) character无法使 Ant 使用 unicode (c) 字符编写正确的版本信息
【发布时间】:2012-05-10 07:17:29
【问题描述】:

在将 Ant 从 1.6 升级到 1.8.3 版本后,使用 Ant 构建的 Windows .dll 的信息资源已损坏。

之前此值已正确保存到版本信息资源中:

product.copyright=\u00a9 Copyright 20xx-20xx yyyyyyyyyy \u2122(因此 (c) 和 TM 符号已正确显示)。

升级 Ant 后默认编码已更改为预期的 UTF-8,但目前版权字符串如下所示:

© Copyright 20xx-20xx yyyyyy ™

不是控制台问题 - 我检查了十六进制编辑器和文件属性对话框 - 两者都显示不正确。

查看文件的hexdump 我看到发生了以下(显然不正确)映射

\u00a9 -> 0x00c2 0x00a9
\u2122 -> 0x00e2 0x201e 0x00a2

这里的问题是 Ant 将 UTF-8 字节(不是 Unicode 字符串)编码为 16 位字符,并将其写入 version-info。

虽然这看起来像是 ant 中的一个错误,但我想问是否有人设法找到解决此问题或类似问题的任何方法。

以下是脚本中的一些 sn-ps: 项目属性文件:

...
product.copyright=(c) Copyright 2005-2012 Clarabridge
....

build.xml 中包含的文件:

<versioninfo id="current-version" if="is-windows"
    fileversion="${product.version}"
    productversion="${product.version}"
    compatibilityversion="1"
    legalcopyright="${product.copyright}"
    companyname="${product.company}"
    filedescription="${ant.project.name}"
    productname="${ant.project.name}"
/>
...
<cc objdir="${target.dir}/${target.platform}/obj"
    outfile="${target.dir}/${target.platform}/${ant.project.name}"
    subsystem="other"
    failonerror="true"
    incremental="false"
    outtype="shared"
    runtime="dynamic"
>
    <versioninfo refid="current-version" />
    <compiler refid="compiler-shared-${target.platform}" />
    <compiler refid="rc-compiler" />
    <linker extends="linker-${target.platform}">
        <libset dir="${target.dir}/${target.platform}/lib" libs="${lib.list}" />
    </linker>

    <fileset dir="${src.dir}" casesensitive="false">
        <include name="*.cpp"/>
    </fileset>
</cc>

【问题讨论】:

  • 您是否尝试使用 ant -Dfile.encoding=utf8 启动 ant,也许您的控制台编码已关闭?
  • 这个参数对我来说是默认包含的;我也没有看控制台输出,我看的是 dll 二进制文件和 Windows 文件属性
  • 好的 :) 所以你有一个创建这些 dll 的 ant 任务(也许将它添加到问题中)?
  • @Fahrenheit2539 您应该发布脚本(使用资源的 sn-p)
  • 不知道有什么帮助,但发布了一些相关的文章

标签: unicode ant utf-8


【解决方案1】:

您的错误是将 UTF-8 字符误解为 8 位字符!!!

顺便说一句,Java 不使用 16 位字符;那将是UCS-2。 Java 使用 UTF-16,它与 UTF-8 一样是可变宽度编码。令人苦恼的是有多少 Java 程序员把这件事搞砸了!

UTF-8 有 8 位代码单元,而 UTF-16 有 16 位代码单元;都不支持“8 位字符”或“16 位字符”。如果您发现自己编写的代码与他们认为的一样,那么您只是编写了有缺陷的代码。

您的输出是错误地显示 UTF-8 的结果,就像它在 Latin1 中一样,确实使用 8 位字符。但是,你没有。

【讨论】:

  • 这里的问题是这里没有我写的一行代码。所以现在我为 Ant 提交了一个错误。我们会看看是否会得到确认
  • @Fahrenheit2539 您的终端程序是否设置为显示 UTF-8? Betcha 任何你唯一的问题。 Windows 在 Unicode 方面非常糟糕。我想你的文件是完全正确的。你就是不知道怎么看。
  • 正如我提到的,我用二进制编辑器检查了 dll 文件,但它不正确。我也不信任控制台输出
  • @Fahrenheit2539 不正确是什么意思?我不相信这些愚蠢的十六进制转储。正确答案是应该显示为 © 的 U+00A9 COPYRIGHT SYMBOL 在 Latin1 中由单字节“\xA9”表示,但在 UTF-8 中由一对字节“\xC2\xA9”表示。如果由于错误而被双重编码,那么它将是四个字节,“\xC3\x82\xC2\xA9”,这就是你刚才显示的。这三个字节序列中的哪一个实际上在文件中?不要只看最后的 A9,因为这三个都是一样的。你必须看看那里有多少个高字节。
  • 你提出了一个很好的建议来重新思考什么是正确的。为此,我查看了另一个具有正确版本信息的 dll 文件(它来自 Windows 的发行版)。并且 (c) 符号表示为单个两字节字符:\x00\xa9 并正确显示
猜你喜欢
  • 2016-10-01
  • 2019-03-08
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 2011-02-27
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多