将 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 一样。但是,您不会。