2

以下の 1 行目と 2 行目ではファイルに BOM が生成されず、3 行目では BOM が生成される理由がわかりましたか? UTF-16LE が正しいエンコーディング名であり、そのエンコーディングはファイルの先頭に BOM を自動的に作成しないと思いました。

new File("foo-wo-bom.txt").withPrintWriter("utf-16le") {it << "test"}
new File("foo-bom1.txt").withPrintWriter("UnicodeLittleUnmarked") {it << "test"}
new File("foo-bom.txt").withPrintWriter("UTF-16LE") {it << "test"}

別のサンプル

new File("foo-bom.txt").withPrintWriter("UTF-16LE") {it << "test"}
new File("foo-bom.txt").getBytes().each {System.out.format("%02x ", it)}

版画

ff fe 74 00 65 00 73 00 74 00

そしてJavaで

        PrintWriter w = new PrintWriter("foo.txt","UTF-16LE");
        w.print("test");
        w.close();
        FileInputStream r = new FileInputStream("foo.txt");
        int c;
        while ((c = r.read()) != -1) {
            System.out.format("%02x ",c);
        }
        r.close();

版画

74 00 65 00 73 00 74 00

Java では BOM は作成されませんが、Groovy では BOM が作成されます。

4

1 に答える 1

0

との動作に違いがあるようwithPrintWriterです。GroovyConsole でこれを試してください

File file = new File("tmp.txt")
try {
    String text = " "
    String charset = "UTF-16LE"

    file.withPrintWriter(charset) { it << text }
    println "withPrintWriter"
    file.getBytes().each { System.out.format("%02x ", it) }

    PrintWriter w = new PrintWriter(file, charset)
    w.print(text)
    w.close()
    println "\n\nnew PrintWriter"
    file.getBytes().each { System.out.format("%02x ", it) }
} finally {
    file.delete()
}

出力します

withPrintWriter
ff fe 20 00

新しい PrintWriter
20 00

これは、 を呼び出すnew PrintWriterと Java コンストラクターが呼び出されますが、withPrintWriter最終的に呼び出すとorg.codehaus.groovy.runtime.ResourceGroovyMethods.writeUTF16BomIfRequired()、BOM を書き込む が呼び出されるためです。

この動作の違いが意図的なものかどうかはわかりません。気になったのでメーリングリストで質問してみました。誰かがデザインの背後にある歴史を知っている必要があります。

編集: GROOVY-7465は、前述の議論から作成されました。

于 2015-06-03T17:54:05.263 に答える