あなたは次のようにフェッチしていると言います:
in = new BufferedReader(new InputStreamReader(url.openStream(),"UTF-8"));
フェッチしているものは UTF-8 でエンコードされていない可能性がかなりあります。
HttpURLConnection オブジェクトを呼び出す必要がありgetContentType()
ます。それが null でない場合は、エンコーディングを抽出して、InputStreamReader
. 応答が有効なエンコーディングのコンテンツ タイプを提供しない場合にのみ、「UTF-8」を想定してください。
振り返ってみると、サーバーから返されたコンテンツ タイプに注意を払う必要がありますが、本当の問題は、*.txt ファイルの書き方にあるか、表示ツールに奇妙な文字が表示されているかのいずれかにあります。
- ファイルの書き込みに使用しているエンコーディングが明確ではありません。おそらくあなたは間違ったものを選んだのでしょう。
- 表示ツールが、ファイルのエンコードが異なると想定している可能性があります。おそらく、ファイルが UTF-8 または UTF-16 であることが検出され、BOM が存在します。
- 表示ツールが単純に壊れていて、改行しないスペースを認識していない可能性があります。
HEX エディタを使用してファイルを表示する場合、バイトをレンダリングするために 8 ビット文字セットを使用する可能性が最も高く、その文字セットはおそらく Latin-1 です。しかし、明らかに、ファイルは実際には異なる方法でエンコードされています。
とにかく、改行しないスペースを置き換えるアプローチは (IMO) ハックであり、将来遭遇する可能性のある他のものには対処しません。そのため、時間をかけて問題を本当に理解し、適切に修正することをお勧めします。
最後に、あなたが Â 文字を取得する理由が理解できたと思います。Unicode NON-BREAKING-SPACE 文字はu00a0
. これを UTF-8 でエンコードすると、C2 A0 になります。しかし、Latin-1 の C2 は CAPITAL-A-CIRCUMFLEX であり、Latin-1 の A0 は NON-BREAKING-SPACE です。したがって、「混乱」は、プログラムが *.txt ファイルを UTF-8 で書き込んでいて、ツールがそれを Latin-1 として読み取っている可能性が最も高いです。