Javaでの「エンコーディング用のマップできない文字」警告


112

私は現在、コンパイル時に次の警告を出すJavaプロジェクトに取り組んでいます。

/src/com/myco/apps/AppDBCore.java:439: warning: unmappable character for encoding UTF8
    [javac]         String copyright = "� 2003-2008 My Company. All rights reserved.";

SOが日付の前に文字をどのようにレンダリングするかはわかりませんが、それは著作権記号である必要があり、警告の中にひし形の疑問符として表示されます。

文字が出力アーティファクトに正しく表示されることは注目に値しますが、警告は煩わしいものであり、このクラスを含むファイルは、エンコーディングを誤って保存するテキストエディターによっていつか操作される可能性があります...

この文字を「著作権」文字列に挿入して、コンパイラーを満足させ、再エンコードの問題が発生することなくシンボルをファイルに保存するにはどうすればよいですか?


どのバイトがその著作権文字を構成しているのかを実際に知ることに興味があります。つまり、hexdump AppDBCore.javaどういうわけかそれ\u00a9を疑い、システムのセットアップのために部分的に機能するものです。上記の疑問符は Unicodehexutf8.com/…
jar

回答:


56

「\ uxxxx」エスケープ形式を使用します。

Wikipediaによると、著作権記号はUnicode U + 00A9なので、次のように記述します。

String copyright = "\u00a9 2003-2008 My Company. All rights reserved.";

13
\ uNNNN文字に注意してください...字句解析を行う前に解析されます。たとえば、このコメント/ * c:\ unit * /をコードに挿入すると、「nit」は正しい16進数ではないため、コンパイルできなくなります。
PeterŠtibraný2009年

3
もちろんです。(これは、Unicodeエスケープが特定のコンテキストでのみ適用されるC#でより適切に処理されますが、危険な\ xエスケープシーケンスもあり、これはひどいものです。)
Jon Skeet

5
これは、治療法というよりはバンドエイドのように聞こえます。実際の問題は、ソースファイルが実際にISO-8859-1やwindows-1252のようなシングルバイトエンコーディングである場合、ソースファイルがUTF-8であると期待するようにjavacに指示していることです。
アランムーア

6
@Alan M:私の経験では、ソースファイルをASCIIで保持することで問題が発生しないことを確認する方が、ソースがコンパイルされる可能性のあるすべての場所で正しいエンコーディングを使用することを確認するよりもはるかに簡単です(Ant、Eclipse、 IDEAなど)。
Jon Skeet、

6
@ジョン、それはJavaの根本的な欠陥です。JavaソースユニットがUTF-8、ISO 8859-1、CP1252、MacRomanなどでエンコードされているという事実は、それを必要とするソースユニットの外部のメタデータで処理されます。これにより、antファイルやEclipse構成などを修正することを忘れないでください。正しく指摘するように、これは情報が壊れやすく、簡単に失われるため、これを行うには最悪の方法です。メタデータ(エンコードメタデータ)とデータ(読み取り:ソースコード)を1か所にまとめる言語は、この点ではるかに堅牢です。それが唯一の健全なアプローチです。
tchrist

91

javac -encoding ISO-8859-1 file_name.javaで試してください


1
私はこのソリューションが好きです。Antのbuild.xmlにコンパイラ引数として「-encoding UTF-8」を追加しても、「警告:ASCIIをエンコードするためのマッピングできない文字」が引き続き表示されます。「-encoding jjjj」に変更するとコンパイルされず、「エラー:サポートされていないエンコーディング:jjjj」と文句を言われるので、UTF-8を認識していることがわかりますが、それでも.javaファイルはasciiとして扱われるようです。はぁ。
dfrankow 2010

1
ant javacタスクの「encoding」パラメーターを試しましたが、同じ問題が発生しました。パラメータを認識しますが、どういうわけか無視します。
dfrankow

20
@dfrankow:ファイルの<compilerarg line="-encoding utf-8"/>該当する<javac>呼び出しの下に追加する必要がありBuild.xmlます。これは悪い方法ですが、選択の余地はありません。上部にある私の長いコメントを参照してください。
tchrist

正常に機能するantスクリプトにcompileargを追加したときに同じ問題が発生しました。これをWindowsコマンドラインからビルドしました。奇妙なのは、eclipseからビルドしていて、compileargがなくても機能しなかったことです。eclipseが注意を払っているようですエンコーディング権の。
simonC

これは私を助けてくれました:) MAC OSX
Arun Abraham

44

Mavenを使用している場合<encoding>は、コンパイラプラグインの構成で明示的に設定します。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>

共有してくれてありがとう、人々がmavenを使ってプロジェクトを構築しているなら、これは正しいアプローチです。
シャミック

2
javadocプラグインは、マップできない文字についても文句を言います。project.build.sourceEncodingプロパティを設定することをお勧めします。
Emmanuel Bourg 2014年

私はすでにproject.build.sourceEncodingプロパティを使用していましたが、どういうわけかそれはコンパイラのエンコーディングプロパティに正しくマップされませんでした。それを明示的に設定することでトリックが行われました
Federico Bonelli 2014年

32

これは私に役立ちました:

あなたがする必要があるのは、JAVA_TOOL_OPTIONSと呼ばれる環境変数を指定することだけです。この変数を-Dfile.encoding = UTF8に設定すると、JVMが起動するたびに、この情報が取得されます。

出典:http : //whatiscomingtomyhead.wordpress.com/2012/01/02/get-rid-of-unmappable-character-for-encoding-cp1252-once-and-for-all/


うわー、それは私の.bashrcに追加するだけで問題が解決しました。
カウボイペン

ビルドするために入力したコマンドラインからjavac MyJavaFile.java -encoding utf-8 -cp .;lib\*、うまくいきました。それを実行するときに、余分なエンコーディング部分を追加する必要はありませんでした。
Azurespot

23

この行をJava confの上のyorファイル.gradleに入れます。

apply plugin: 'java'
compileJava {options.encoding = "UTF-8"}   

あなたはのエンコーディングを設定することもできますcompileTestJavaし、ためjavadocにも
フランクNeblung

8

ほとんどの場合、このコンパイルエラーは、ユニコード(UTF-8エンコード)ファイルのコンパイル時に発生します

javac -encoding UTF-8 HelloWorld.java

また、このコンパイルオプションをIDEに追加できます。例:Intellij idea
([ファイル]> [設定]> [Javaコンパイラ])追加のコマンドラインパラメータとして追加

ここに画像の説明を入力してください

-encoding: encoding EUC-JPやUTF-8などのソースファイルのエンコーディング名を設定します。-encodingが指定されていない場合、プラットフォームのデフォルトコンバータが使用されます。(DOC


8

Gradleステップ

Gradleを使用している場合は、Javaプラグインを適用する行を見つけることができます。

apply plugin: 'java'

次に、コンパイルタスクのエンコーディングをUTF-8に設定します。

compileJava {options.encoding = "UTF-8"}   

単体テストがある場合、おそらくそれらもUTF-8でコンパイルする必要があります。

compileTestJava {options.encoding = "UTF-8"}

全体的なGradleの例

つまり、全体的なGradleコードは次のようになります。

apply plugin: 'java'
compileJava {options.encoding = "UTF-8"}
compileTestJava {options.encoding = "UTF-8"}

2

これは私のために働いた-

    <?xml version="1.0" encoding="utf-8" ?>
<project name="test" default="compile">
    <target name="compile">
        <javac srcdir="src" destdir="classes" 
                           encoding="iso-8859-1" debug="true" />
    </target>
</project>

1

Eclipseを使用している場合(Eclipseはutf8文字を書き込んでもutf8コードを配置できます。プログラミングすると通常のutf8文字が表示されますが、バックグラウンドはutf8コードです)。

  1. プロジェクトを選択
  2. 右クリックして[ プロパティ ]を選択します
  3. 選択リソースリソースパネル(2後に開かれた右のメニューのトップへ)
  4. あなたはリソースパネルテキストファイルエンコーディングで見ることができます、あなたが望む他のものを選択してください

PS:これは、コード内の静的な値であれば問題ありません。文字列の例test = "İİİİİııııııçççççç";


1
「プログラミングしているときは通常の[a] utf8文字が表示されますが、[背景]はutf8コードになります」という説明は意味がありません。また、上記の質問に対する私の長いコメントを参照してください。
tchrist '15

ISO-8859-1に変更しましたが、「UTF8をエンコードするためのマップできない文字」に関するコンパイルエラーが発生しました。
pacoverflow 2017年

1

同じ問題がありましたが、Javaエラーメッセージで報告された文字インデックスが正しくありませんでした。報告された位置が16進数の022ではなく16進数の094(引用ではなくキャンセルですが、引用として表されます)になる直前の二重引用符に絞り込みました。


1

コマンドプロンプトからMavenビルドを使用している場合は、次のコマンドも使用できます。

                    mvn -Dproject.build.sourceEncoding=UTF-8

1

なぜこれが一部のシステムで発生し、他のシステムでは発生しないのか(同じソース、ビルドパラメーターなどを使用している場合)、環境変数を確認してくださいLANG。ときLANG=C.UTF-8に警告/エラーが表示されますが、は表示されませんLANG=en_US.UTF-8

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.