无法让 Ant 使用 unicode (c) 字符写入正确的版本信息



将 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 位字符并将其写入版本信息。

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

以下是脚本中的一些片段:项目属性文件:

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

包含在构建中的文件.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>

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

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

UTF-8 有 8 位代码

单元,而 UTF-16 有 16 位代码单元;两者都不支持"8 位字符"或"16 位字符"。如果你发现自己在写代码时认为自己在写,那么你只是写了有缺陷的代码。

您的输出是错误地显示 UTF-8 的结果,就好像它是使用 8 位字符的 Latin1 一样。但是,您不会。

相关内容

  • 没有找到相关文章

最新更新