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

时间:2012-05-10 07:17:30

标签: unicode ant utf-8

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

以前,此值已正确保存到version-info资源:

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。

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

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

...
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>

1 个答案:

答案 0 :(得分:2)

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

BTW,Java不使用16位字符;这将是UCS-2。 Java使用UTF-16,它与UTF-8一样具有可变宽度编码。令人痛苦的是有多少Java程序员搞砸了!

UTF-8具有8位代码单元,其中UTF-16具有16位代码单元;两者都不支持“8位字符”或“16位字符”。如果你发现自己编写的代码认为他们做了,那你就编写了错误的代码。

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