2016-11-17 4 views
25

ファイルを文字列に読み込むスキャナクラスがあります。この文字 "®"を持つファイルはすべて失敗します。私はJavaを使い慣れていないので、このファイルを読み込んで文字を受け入れるより良い方法がありますか?Java Scanner Class bad character "®"

public void readFile(String fileName) 
{ 
    fileText = ""; 

    try 
    { 
     Scanner file = new Scanner(new File(fileName)); 
     while (file.hasNextLine()) 
     { 
      String line = file.nextLine(); 
      fileText += line +"\r"+"\n"; 
     } 
     file.close(); 
    } 
    catch (Exception e) 
    { 
     System.out.println(e); 

    } 
     } 
+4

どのようなエラーが発生しますか? – DejaVuSansMono

+1

可能であれば、(R)文字を含むファイルの小セクションを置くためにhexdump -Cを使うことができます... – Adam

+0

"この文字を含むファイル"は "失敗します"どのように伝えることができますか? – VGR

答えて

16

は、プラットフォームのデフォルトの文字エンコーディングを使用して、これはファイルの文字エンコーディングと一致しない場合があります。 JavaDoc状態:

は 指定されたファイルからスキャンされた値を生成するScannerを新しく作成します。ファイルのバイトは、基本となるプラットフォームのデフォルトの文字セットを使用して、文字 に変換されます。

まず、ファイルがどの文字エンコーディングであるかを調べます。これは、Linuxコマンドラインユーティリティfile -iで行うことができます。正しいエンコーディングをスキャナに渡します。 Java 7には、いくつかのよく知られた文字セットの定義済みの定数がjava.nio.charset.StandardCharsetsに含まれています。

Scanner file = new Scanner(new File(fileName), StandardCharsets.UTF_8); 
+0

"あなたのファイルをどのようにエンコードしているかを判断する"それは一般的な問題のように見えますか?誰もが最高の推測でより良い方法を持っていますか? – Minerbob

+0

@Minerbob Oneは、データファイルがどのエンコーディングを使用しているかを事前に知っているはずです。顧客があなたに送るかもしれないランダムなファイルを開くビジネスをしているなら、賢明な推測が最良の選択です。 – GSerg

10

スキャナの作成時には、エンコーディングが記載されています。デフォルトのスキャナによって

Scanner file= new Scanner(new File(fileName), "utf-8");

+0

私はBlueJを使用していましたが、ループを終了して文字列を空のままにしていたというエラーは表示されませんでした。 – Minerbob

+2

私はutf-8がうまくいきませんでしたが、私がISO-8859-1を使用したとき、それをリードしてくれてありがとう。私は少し読む必要があるように見えます。ありがとうございました。 – Minerbob