2012-01-18 10 views
3

私は、次のプロパティを持つテキストファイルからデータを読んでいます:ファイルからの特殊文字を読む - Javaの

エンコード:ANSI
ファイルタイプ:PC

今、ファイルは、多くのが含まれています等の度記号(º)などの特殊文字私は、次のコードを使用してこのファイルを読んでいます:

File file = new File("C:\\X\\Y\\SpecialCharacter.txt"); 
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8")); 

ファイルENCOの場合dingがANSIの場合、上記のコードは特殊文字e.xを正しく読み込みません。ファイル内の行:
「低級熱および製品が165ºFの内部温度に達するまで煮る」、reader.readLine()だろう出力:
「低級熱を、生成物を165Fの内部温度に達するまで煮る」

Iが変化ファイルをUTF-8にエンコードすると、その行はファイル内にあるように特殊文字を混乱させることなく読み込みます。

私の質問は、どの時点でデータが乱れるのですか?データをファイルに保存するとき、またはファイルから読み込むとき?メモ帳でファイルを開くと、すべての特殊文字が正しく表示されます。それはどうですか?

hexdumpが出力:

  -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -A -B -C -D -E -F 

00000000- 4C 6F 77 65 72 20 68 65 61 74 20 61 6E 64 20 73 [Lower heat and s] 
00000001- 69 6D 6D 65 72 20 75 6E 74 69 6C 20 70 72 6F 64 [immer until prod] 
00000002- 75 63 74 20 72 65 61 63 68 65 73 20 69 6E 74 65 [uct reaches inte] 
00000003- 72 6E 61 6C 20 74 65 6D 70 65 72 61 74 75 72 65 [rnal temperature] 
00000004- 20 6F 66 20 31 36 35 BA 46      [ of 165.F  ] 
+0

、そのファイルから該当の行の[ 'hexdump'](http://www.richpasco.org/utilities/hexdump.html)を投稿してください。そのようにして、「º」がどのようにコード化されているかを知ることができます。 –

+0

@MikeSamuel: –

答えて

9

"ANSI" は、特定のエンコーディングではありません - それは、エンコーディングの全体コレクションです。ファイルを読むときにの右にエンコーディングを使用する必要があります。たとえば、Windows-1252エンコーディングを使用している可能性があります。つまり、あります。エンコーディング名として "Cp1252"を渡してみてください。

実際には、ではない「UTF-8」を渡しています。通常、ANSIと呼ばれるエンコードの1つです。ファイルが使用する正確なエンコーディングを見つけて、InputStreamReaderパラメータで指定する必要があります。

私の質問は、どの時点でデータが混乱するのですか?データをファイルに保存するとき、またはファイルから読み込むとき?

あなたが興味を持っているすべての文字を表すことができると仮定すると、それはファイルを読むときだけです。基本的には、実際に別のエンコーディングに入っているかのように、そのエンコーディングを読み込もうとしています。メモ帳は何らかのヒューリスティックエンコーディング検出を実行しているか、この特定の状況で適切なデフォルトのを使用しています。

+0

というテキストの出力を追加しました。この特定の状況に適切なデフォルトを使用しています。メモ帳は日常的にファイルを正しく読み取れません。一方、ワードパッドは、エンコードをある程度検出します。 – Sheriff

+0

@Jon Skeet:ファイルが特殊文字を使って書かれたとき、使用されるエンコーディングは、ファイルを作成したプログラム/ JVMのデフォルト設定に完全に依存していたので、ここで理解していると思います。ファイルのプロパティを見ると、エンコードは何とか「汎用」ですか? E。システム上にファイルを作成し、 'System.getProperty(" file.encoding ")'が 'UTF-8'を返すと、ファイルプロパティは同じファイルのエンコーディングを' UTF-8 'として表示します。 –

+0

@ darkie15:あなたは「ファイルプロパティ」とは何ですか? –

1

new InputStreamReader(new FileInputStream(file), "UTF-8")UFT-8エンコードファイル:異なる形式でエンコードされたファイル(Win 1252など)を読み込んでいる場合は、それに応じて2番目のパラメータを変更する必要があります。

テキストファイルはコード化されていません。エンコーディングされているので、読み込み時に同じエンコーディングを使用する必要があります。これにより、システムはその生ストリームのストリームを解釈し、あなたが "正しい"グリフを見ることができるようにするために、適切な文字[またはUnicodeを行っているならば、Unicodeのコードポイント]とバイト[s]のグループ。

これは少し明確です。

乾杯