web-dev-qa-db-ja.com

「UTF-8」としてエンコードされているJavaソースファイルをコンパイルする方法は?

JavaソースファイルにエンコードタイプをUTF-8として指定し(メモ帳を使用、デフォルトではメモ帳のエンコードタイプはANSI))、次に以下を使用してコンパイルしようとしました。

javac -encoding "UTF-8" One.Java

エラーメッセージが表示された」

One.Java:1: illegal character: \65279

?public class One {

^
1 error

他の方法はありますか、これをコンパイルできますか?

ソースは次のとおりです。

public class One {
    public static void main( String[] args ){
        System.out.println("HI");
    }
} 
28
asela38

あなたのファイルisはUTF-8として読み込まれます。そうでなければ、値 "65279"の文字は決して現れません。 javacは、ソースコードがプラットフォームのデフォルトエンコーディングであると想定しています。これは、 javacドキュメント に従っています

-encodingが指定されていない場合、プラットフォームのデフォルトコンバーターが使用されます。

10進数65279は16進数FEFFです。これは nicodeバイトオーダーマーク(BOM) です。 UTF-8は常にオクテットストリームとしてエンコードされ、エンディアンの問題がないため、UTF-8では不要です。

メモ帳は、BOMが必要でない場合でもBOMに固執するのが好きですが、一部のプログラムはBOMを見つけるのが好きではありません。他の人が指摘しているように、メモ帳はあまり良いテキストエディターではありません。別のテキストエディターに切り替えると、ほぼ確実に問題が解決します。

45
Daniel Pryden

Notepad ++でファイルを開き、[エンコーディング]-> [BOMなしでUTF-8に変換]を選択します。

20
Adrian Toman

これはテキストエディターの問題ではなく、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結果にあるため、今後の読者のためにここに残します。

11

javac -encoding UTF8 One.Java

引用符がなく、UTF8の場合、ダッシュはありません。

その他のリンクについては、このフォーラムスレッドをご覧ください

9
StevenWilkins

以下を参照してください。たとえば、プログラムと話し合うことができます(テルグ語)

プログラム(UnicodeEx.Java)

class UnicodeEx {  
    public static void main(String[] args) {   
        double ఎత్తు = 10;  
        double వెడల్పు = 25;   
        double దీర్ఘ_చతురస్ర_వైశాల్యం;  
        System.out.println("The Value of Height = "+ఎత్తు+" and Width = "+వెడల్పు+"\n");  
        దీర్ఘ_చతురస్ర_వైశాల్యం = ఎత్తు * వెడల్పు;  
        System.out.println("Area of Rectangle = "+దీర్ఘ_చతురస్ర_వైశాల్యం);  
    }  
}

これは「UnicodeEx.Java」として保存し、エンコードを「unicode」に変更するプログラムです

**​​コンパイル方法**

javac -encoding "unicode" UnicodeEx.Java

実行方法

Java UnicodeEx

高さの値= 10.0および幅= 25.0

長方形の面積= 250.0

5
Prashanth

私はこれが非常に古いスレッドであることを知っていますが、PHPの代わりにJavaで同様の問題を経験し、Googleがここに連れて行ってくれました。 Notepad ++(プレーンなメモ帳ではない)でPHPを書いていて、インクルードファイルを呼び出すたびに余分な白い線が表示されることに気付きました。 Firebugは、これらの余分な行に65279文字があることを示しました。

実際には、メインのPHPファイルとインクルードファイルの両方がUTF-8でエンコードされました。ただし、Notepad ++には、「BOMなしのUTF-8」としてエンコードするオプションもあります。これで問題が解決しました。

結論:UTF-8エンコーディングは、エディターにBOMなしでUTF8を使用するよう指示しない限り、この追加のBOM文字をあちこちに挿入します。

4
vaelico

ここでも問題なく機能し、メモ帳で編集することもできます。物語の教訓は、メモ帳を使用しないことです。そこには、メモ帳が挿入している、または喜んであなたから隠れている印刷できない文字があります。

0
Nick Veys

Intellij Idea([設定]> [エディター]> [ファイルエンコーディング])では、プロジェクトのエンコーディングは「windows-1256」でした。そこで、次のコードを使用して静的文字列をutf8に変換しました

protected String persianString(String persianStirng) throws UnsupportedEncodingException {
    return new String(persianStirng.getBytes("windows-1256"), "UTF-8");
}

今では大丈夫です!ファイルのエンコーディングに応じて、「windows-1256」を適切なものに変更する必要があります

  • ワードパッドまたはメモ帳以外のエディターでファイルを開きます。

  • テキストドキュメントとして名前を付けて保存-MS-DOS形式を選択します。

  • プロジェクトを再度開く

0
Satyam Gupta

Linuxユーザー向けのソリューションで既存の回答を拡張するには

すべての.JavaファイルのBOMを一度に削除するには、ソースディレクトリに移動して実行します

find -iregex '.*\.Java' -type f -print0 | xargs -0 dos2unix

findxargs、およびdos2unixをインストールする必要があります。これらはほとんどのディストリビューションに含まれている必要があります。最初のステートメントは現在のディレクトリ内のすべての.Javaファイルを再帰的に検索し、2番目のステートメントはdos2unixツールで各ファイルを変換します。このツールは行末を変換するだけでなく、BOMも削除します。

バージョン管理を正しく構成する場合、Linuxで既に\n形式になっているはずなので、行末変換は効果がありませんが、そのようなまれなケースの1つがある場合はそれを行うことを警告します意図されていません。

0
Konrad Höffner

同じ問題がありました。それを解決するために、16進エディタでファイルを開き、ファイルの先頭に3つの「見えない」バイトを見つけました。それらを削除し、コンパイルは機能しました。

0
Vic