web-dev-qa-db-ja.com

「UTF-8をエンコードするためのマップできない文字」エラー

次の方法でコンパイルエラーが発生します。

public static boolean isValidPasswd(String passwd) {
    String reg = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[~#;:?/@&!\"'%*=¬.,-])(?=[^\\s]+$).{8,24}$";
    return Pattern.matches(reg, passwd);
}
 Utility.Java:[76,74] UTF-8をコーディングするための
マッピングできない文字。 74番目の文字は '"' 

どうすれば修正できますか?ありがとう。

62
Ravi

ソースコードファイルにエンコードの問題があります。 ISO-8859-1でエンコードされている可能性がありますが、コンパイラはUTF-8を使用するように設定されています。これにより、UTF-8とISO-8859-1で同じバイト表現を持たない文字を使用するとエラーが発生します。これは、ASCIIの一部ではないすべての文字、たとえば¬NOT SIGN で発生します。

次のプログラムでこれをシミュレートできます。ソースコードの行を使用し、ISO-8859-1バイト配列を生成し、UTF-8エンコーディングでこの「間違った」デコードを行います。行が破損する位置を確認できます。これを¬NOT SIGN に合うように位置74に合うようにソースコードに2つのスペースを追加しました。これは、ISO-8859-1エンコードで異なるバイトを生成する唯一の文字です。 UTF-8エンコード。これにより、インデントが実際のソースファイルと一致します。

 String reg = "      String reg = \"^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[~#;:?/@&!\"'%*=¬.,-])(?=[^\\s]+$).{8,24}$\";";
 String corrupt=new String(reg.getBytes("ISO-8859-1"),"UTF-8");
 System.out.println(corrupt+": "+corrupt.charAt(74));
 System.out.println(reg+": "+reg.charAt(74));     

これにより、次の出力が生成されます(マークアップのために混乱します)。

文字列reg = "^(?=。[0-9])(?=。[az])(?=。[AZ])(?=。[〜#;:?/ @&! "'%* =�。、-])(?= [^\s] + $)。{8,24} $ ";:�

文字列reg = "^(?=。[0-9])(?=。[az])(?=。[AZ])(?=。[〜#;:?/ @&! "'%* =¬。、-])(?= [^\s] + $)。{8,24} $ ";:¬

https://ideone.com/ShZnB の「ライブ」を参照してください

これを修正するには、ソースファイルをUTF-8エンコードで保存します。

45

2000年に開始されたレガシーシステム用にLinuxボックスにCIビルドサーバーをセットアップしています。UTF8以外の文字を含むPDFを生成するセクションがあります。私たちはリリースの最終段階にいるので、悲しみを与えるキャラクターを置き換えることはできませんが、ディルベルテスクの理由で、リリース後この問題を解決するのに一週間待つことはできません。幸いなことに、Antの「javac」コマンドには「エンコード」パラメーターがあります。

 <javac destdir="${classes.dir}" classpathref="production-classpath" debug="on"
     includeantruntime="false" source="${Java.level}" target="${Java.level}"

     encoding="iso-8859-1">

     <src path="${production.dir}" />
 </javac>
13
Steve Gelman

Javaコンパイラは、入力がUTF-8でエンコードされていると想定します。これは、指定されているか、プラットフォームのデフォルトエンコードであるためです。

ただし、.Javaファイルのデータは実際にはUTF-8でエンコードされていません。問題はおそらく¬文字です。選択したエディター(またはIDE)が、UTF-8エンコードでファイルを実際に保護していることを確認してください。

6
Joachim Sauer

答えてくれたMichael Konietzka( https://stackoverflow.com/a/4996583/1019307 )に感謝します。

Eclipse/STSでこれを行いました:

Preferences > General > Content Types > Selected "Text" 
    (which contains all types such as CSS, Java Source Files, ...)
Added "UTF-8" to the default encoding box down the bottom and hit 'Add'

ビンゴ、エラーが消えました!

3
HankCa

Eclipseで、ファイルのプロパティ(Alt + Enter)に移動して、リソースを変更します-> 'Text File encoding'-> Other to UTF-8ファイルを再度開き、文字列/ファイルのどこかにジャンク文字があることを確認します。それを除く。ファイルを保存します。

エンコーディングリソースを変更します->「テキストファイルエンコーディング」をデフォルトに戻します。

コードをコンパイルしてデプロイします。

3
john

IntelliJユーザーの場合、元のエンコーディングが何であるかがわかれば、これは非常に簡単です。ウィンドウの右下隅からエンコードを選択できます。ダイアログボックスが表示されます:

選択したエンコード(「[エンコードタイプ]」)により、「[あなたのファイル]」の内容が変更される場合があります。ディスクからファイルをリロードするか、テキストを変換して新しいエンコードで保存しますか?

そのため、何らかの奇妙なエンコーディングでいくつかの文字が保存されている場合、まず「リロード」を選択して、不良文字のエンコーディングでファイルをすべてロードする必要があります。私にとって、これは?文字を適切な値に変換します。

IntelliJは、適切なエンコーディングを選択しなかった可能性が高いかどうかを判断でき、警告を表示します。元に戻し、再試行してください。

不良文字が消えたら、右下隅のエンコード選択ボックスを元の形式に戻します(このエラーメッセージをグーグルで検索している場合は、UTF-8になります)。今回は、ダイアログの「変換」ボタンを選択します。

私にとっては、「windows-1252」としてリロードし、「UTF-8」に戻す必要がありました。問題の文字は一重引用符(「and」)であり、おそらく間違ったエンコーディングでWord文書(または電子メール)から貼り付けられ、上記のアクションはそれらをUTF-8に変換します。

3
cwash

コンパイラは、ソースファイルの読み取りにUTF-8文字エンコードを使用しています。ただし、ファイルは異なるエンコードを使用してエディターによって書き込まれている必要があります。 UTF-8エンコードに設定されたエディターでファイルを開き、引用符を修正して、再度保存します。

または、文字のUnicodeポイントを見つけて、ソースコードでUnicodeエスケープを使用できます。たとえば、文字Aは、Unicodeエスケープ\u0041に置き換えることができます。

ちなみに、matches()メソッドを使用する場合、開始行と終了行のアンカー^$を使用する必要はありません。 matches()メソッドを使用する場合、シーケンス全体が正規表現と一致する必要があります。アンカーはfind()メソッドでのみ有用です。

2
erickson

以下は私のためにコンパイルします:

class E{
   String s = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[~#;:?/@&!\"'%*=¼.,-])(?=[^\\s]+$).{8,24}$";
}

見る:

enter image description here

1
OscarRyz

「エラー:UTF-8をエンコードするためのマップ不可文字」は、JavaがUTF-8で表されていない文字を見つけたことを意味します。そのため、エディターでファイルを開き、文字エンコードをUTF-8に設定します。 UTF-8で表されていない文字を見つけることができるはずです。この文字を削除して再コンパイルします。

1
Ganesh R