web-dev-qa-db-ja.com

BOMを使用してUTF8エンコードされたJavaソースコードをコンパイル(javac)する

こんにちは、私の投稿を読んでくれてありがとう。

私の問題は次のとおりです。Java "javac"のソースファイルをコンパイルします。このファイルはBOMでUTF-8エンコードされています(OSはWinXP)。

以下は私がすることです:

1)「メモ帳」でファイルを作成し、UTF-8エンコーディングを選択します

dos> notepad Test.Java
"File -> Save as..."
File name   : Test.Java
Save as type: All Files
Encoding    : UTF-8
Save

2)Javaクラスを作成し、1のようにファイルを保存します)

public class Test
{
    public static void main(String [] args)
    {
        System.out.println("This is a test.");
    }
}

3)ファイルの16進数バージョンを視覚化する(最初の行)

dos> xxd Test.Java | head -1
0000000: efbb bf70 7562 6c69 6320 636c 6173 7320  ...public class

注:ef bb bfは、UTF-8でエンコードされたBOMです(UTF-16でエンコードされたBOMはFE FFです)。

4)このコードを「javac」でコンパイルしてみてください

dos> javac -encoding utf8 Test.Java
Test.Java:1: illegal character: \65279
?public class Test
^
1 error

注:65279は、BOMの10進数バージョンです。

私の質問は次のとおりです:このコンパイルをどのように機能させることができますか:

  • uTF-8エンコードを維持する
  • bOMを維持しますか?

よろしくお願いします。

レア

16
Léa Massiot

BOMをトリムしてから、javac -encoding utf8 x.Java

24
el fuego

これはテキストエディタの問題ではなく、javacの問題です。 Unicode仕様では、BOMはUTF-8ではオプションであると記載されていますが、禁止されているわけではありません! BOMが存在できる場合、javacはそれを処理する必要がありますが、そうではありません。実際、UTF-8ファイルでBOMを使用するIS ANSIコード化ファイルとUnicodeコード化ファイルを区別するのに役立ちます。

BOMを削除するという提案された解決策は回避策にすぎず、適切な解決策ではありません。

このバグレポートは、この「問題」が修正されることは決してないことを示しています。 http://bugs.Java.com/view_bug.do?bug_id=4508058

このスレッドは「javac BOM」検索の上位2件のGoogle検索結果に含まれているため、今後の読者のためにここに残しておきます。

15

https://stackoverflow.com/a/28043356/7050261

実際、UTF-8ファイルでBOMを使用するIS ANSIコード化ファイルとUnicodeコード化ファイルを区別するのに役立ちます。

実は

  • BOMはANSIとUnicodeを区別するものではありません。設計されていない機能を故意に使用しないでください。

  • UTF-8は意図的にANSIと下位互換性を持つように設計されているため、0..127バイトのみに依存するフォーマットされたテキスト(XML、JSONなど)を処理するために記述された多くのコードは、UTF-8でエンコードされたテキストなしで正しく機能します。変更。

0
Andrey Skoskin