3

Ant を 1.6 から 1.8.3 にアップグレードした後、Ant でビルドされた Windows .dll のバージョン情報リソースが破損しました。

以前は、この値は version-info リソースに適切に保存されていました。

product.copyright=\u00a9 Copyright 20xx-20xx yyyyyyyyyy \u2122(したがって、(c) と TM 記号は正しく表示されました)。

Ant のアップグレード後、デフォルトのエンコーディングは予期される UTF-8 に変更されましたが、現在、著作権文字列は次のようになっています。

© Copyright 20xx-20xx yyyyyy ™

これはコンソールの問題ではありません。16 進エディタと [ファイルのプロパティ] ダイアログで確認しましたが、どちらも正しく表示されません。

ファイルhexdumpを見ると、次の(明らかに間違った)マッピングが発生していることがわかります

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

ここでの問題は、Ant が (Unicode 文字列ではなく) UTF-8 バイトを 16 ビット文字にエンコードし、それを version-info に書き込むことです。

これは ant のバグのように見えますが、誰かがこの問題または同様の問題の回避策を見つけることができたかどうかを尋ねたいと思います。

スクリプトの一部を次に示します。 プロジェクト プロパティ ファイル:

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

1 に答える 1

2

あなたのバグは、何かがUTF-8文字を8ビット文字として誤って解釈していることです!!!

ところで、Javaは16ビット文字を使用しません。それはUCS-2になります。JavaはUTF-16を使用します。これは、UTF-8と同じくらい可変幅のエンコーディングです。何人のJavaプログラマーがこれを台無しにするのか悩む!

UTF-8には8ビットのコードユニットがあり、UTF-16には16ビットのコードユニットがあります。どちらも「8ビット文字」または「16ビット文字」をサポートしていません。彼らがそうだと思うコードを書いていることに気づいたら、バグのあるコードを書いただけです。

出力は、 8ビット文字を使用するLatin1のようにUTF-8を誤って表示した結果ですしかし、あなたはそうしません。

于 2012-05-10T12:37:59.180 に答える