2

私のクライアントは、InputStreamReader/BufferedReader を使用してインターネットからテキストをフェッチします。ただし、テキストを *.txt に保存すると、テキストに「Â」などの奇妙な特殊記号が表示されます。

  • 私は文字列を ASCII に変換しようとしましたが、私が使用する å,ä,ö,Ø を台無しにしました。

  • 私は食べ物を試しました=food.replace("Â", ""); and IndexOf(); しかし、文字列はそれを見つけられません. しかし、それはHEXエディターにあります。

要約:text.setText(Android)を使用すると、出力は奇妙な記号なしで問題ないように見えますが、テキストを *.txt に保存すると、約4つの「Â」が表示されます。他の非 ASCII 文字を使用しているため、ASCII は必要ありません。「Â」は、Android とメモ帳で空白として表示されます。

ありがとう!

良い週末を!

編集:すべての改行なしスペースを削除して解決しました:

myString.replaceAll("\\u00a0"," ");
4

1 に答える 1

1

あなたは次のようにフェッチしていると言います:

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 として読み取っている可能性が最も高いです。

于 2012-04-14T11:34:42.807 に答える