2012-03-27 10 views
4

私は、次のテキストファイルがあります。Javaで奇妙なユニコード文字を読み取っていますか?

enter image description here

ファイルはUTF-8エンコーディングで保存されました。

私は、ファイルの内容を読み取るために、次のコードを使用:

FileReader fr = new FileReader("f.txt"); 
BufferedReader br = new BufferedReader(fr); 
String s1 = br.readLine(); 
String s2 = br.readLine(); 
System.out.println("s1 = " + s1.length()); 
System.out.println("s2 = " + s2.length()); 

出力:

s1 = 5 

s2 = 4 

その後、私はS1の最初の文字を取得するためにs1.charAt(0);を使用しようと、それはでした''(空白)文字。だから、s1の長さは5です。s1.trim();の長さをまだ使用しようとしても、私はその長さがまだ5ではありません。 なぜそれが起こったのか分かりませんか?ファイルがASCIIエンコーディングで保存されていれば正しく動作しました。

+0

IGNORE | REPLACE | REPORTあなたが最初の行の末尾にスペースがないことを確認している間に選ぶことができますか?それ以外の場合は 'String.trim'を使用してください – scibuff

+0

これはメモ帳のバグです。あなたはそれを報告すべきです。 – tchrist

答えて

1

これは実際には空白ではなく、BOM-Byte Order Markです。 WindowsはBOMを使用して、ファイルをユニコード(UTF-8、UTF-16およびUTF-32)エンコードファイルとしてマークします。

I と考えると、メモ帳でもBOMなしでファイルを保存できます(実際には必要ありません)。

+0

これはよく知られたWindowsのバグです。 – tchrist

7

メモ帳では、最初にUTF-8としてマークする印刷不可能な文字をファイルに保存していたようですが、使用する必要はありません(実際には推奨されません)。あなたはそれを無視または削除することができます。他のテキストエディタでは、BOMの有無にかかわらずUTF-8を使用することができます。

+0

しかし、Javaでそのような文字を削除するにはどうしたらいいですか? – ipkiss

+1

@ipkiss:if(s1.charAt(0)== '\ uFEFF')s1 = s1.substring(1); –

0

たとえば、ヌル文字。 (char)0を使用すると、 ''に翻訳されます。

ファイルリーダーがファイルの先頭にヌル文字を読み込んでいる可能性があります。私はなぜ思っていますか...

0

s1.trim()を使用しようとしても、その長さは、まだ5

私はあなたがこれをやっていることを期待して:あなたはそれをやりたいしません

s1.trim(); 

。 Javaの文字列は不変で、trim()メソッドは新しいStringを作成しています。それからあなたは捨て去ります。あなたはこれを実行する必要があります:あなたはそれを使用することができるように何かにtrim()によって作成された新しい文字列への参照を代入し

s1 = s1.trim(); 

を...。

(注:trim()は常に新しい文字列を作成していない元の文字列が何の先頭または末尾の空白を持っていない場合は、trim()方法は、単に、あるそれを返します。)

1

さて、あなたがしようとすることができます別のエンコードを使用してファイルを読んでください。

BufferedReaderのリーダーパラメータとしてOutputStreamReaderクラスを使用する必要があります。それはエンコーディングを受け入れます。それについてJava Docsを確認してください。ややこのような

BufeferedReader out = new BufferedReader(new OutputStreamReader(new FileInputStream("jedis.txt),"UTF-8"))) 

それとも、UTF-8へのシステムプロパティfile.encodingで現在のシステムエンコーディングを設定することができます。

java -Dfile.encoding=UTF-8 com.jediacademy.Runner arg1 arg2 ... 

だけ、この特定のファイルのためにそれを必要とする場合にも、System.setProperty(...)と、実行時にシステムプロパティとして設定することができますが、このような場合には、私はOutputStreamWriterを好むだろうと思います。

システムプロパティを設定すると、FileReaderを使用でき、ファイルのデフォルトエンコードとしてUTF-8が使用されることが期待されます。この場合は、読み書きするすべてのファイルが対象です。

ファイル内のデコードエラーを検出する場合は、OutputStreamReaderアプローチを使用し、デコーダを受け取るコンストラクタを使用する必要があります。

やや

CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder(); 
decoder.onMalformedInput(CodingErrorAction.REPORT); 
decoder.onUnmappableCharacter(CodingErrorAction.REPORT); 
BufeferedReader out = new BufferedReader(new InputStreamReader(new FileInputStream("jedis.txt),decoder)); 

のようにあなたはアクション

関連する問題