web-dev-qa-db-ja.com

特殊文字を含む.textファイルの読み取り/書き込み

メモ帳(Windows)を開いて書き込みます

Some lines with special characters
Special: Žđšćč

名前を付けて保存... "someFile.txt"にEncodingUTF-8に設定します。

Java私は持っています

FileInputStream fis = new FileInputStream(new File("someFile.txt"));
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader in = new BufferedReader(isr);

String line;
while((line = in.readLine()) != null) {                         
    printLine(line);
}
in.close();

しかし、疑問符や同様の「特殊」文字が表示されます。どうして?

編集:私はこの入力を持っています(.txtファイルの1行)

665,Žđšćč

そしてこのコード

FileInputStream fis = new FileInputStream(new File(fileName));
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader in = new BufferedReader(isr);

String line;
while((line = in.readLine()) != null) {
    Toast.makeText(mContext, line, Toast.LENGTH_LONG).show();

    Pattern p = Pattern.compile(",");
    String[] article = p.split(line);

    Toast.makeText(mContext, article[0], Toast.LENGTH_LONG).show();
    Toast.makeText(mContext, Integer.parseInt(article[0]), Toast.LENGTH_LONG).show();
}
in.close();

そしてToast出力(Androidに慣れていない人のために、Toastは特定のテキストを含むポップアップを画面に表示するための単なる方法です) 結構です。コンソールに「奇妙な文字」が表示されます(おそらくコンソールウィンドウでのエンコードが原因です)。しかし、コンソールがこれを言うので、整数の解析に失敗します(warning: toast output is just fine)- 問題

文字列には、Toastが表示/レンダリングできない「奇妙な」文字が含まれているようですが、解析しようとするとクラッシュします。提案?

ANSIをメモ帳に入れると機能し(整数解析)、上の図のような奇妙な文字はありませんが、もちろん私の特殊文字は機能しません。

9
svenkapudija

これらの文字をサポートしていないのは出力コンソールです。 Eclipseを使用しているため、これにUTF-8を使用するように構成されていることを確認する必要があります。これを行うには、ウィンドウ>設定>一般>ワークスペース>テキストファイルエンコーディング> UTF-8に設定します。

参照:


Update更新された質問とコメントによると、明らかに TF-8 BOM が原因です。メモ帳はデフォルトで保存時にUTF-8BOMを追加します。 HTCのJREがそれを飲み込んでいないようです。コードでUnicodeReaderの代わりに、 この回答 で概説されているInputStreamReaderの例を使用することを検討することをお勧めします。 BOMを自動検出してスキップします。

_FileInputStream fis = new FileInputStream(new File(fileName));
UnicodeReader ur = new UnicodeReader(fis, "UTF-8");
BufferedReader in = new BufferedReader(ur);
_

実際の問題とは関係なく、finallyブロック内のリソースを閉じて、例外が発生した場合にリソースが確実に閉じられるようにすることをお勧めします。

_BufferedReader reader = null;
try {
    reader = new BufferedReader(new UnicodeReader(new FileInputStream(fileName), "UTF-8"));
    // ...
} finally {
    if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {}
}
_

また、関係ありませんが、Pattern p = Pattern.compile(",");をループの外側に配置するか、静的定数にすることをお勧めします。これは、コンパイルに比較的コストがかかり、ループ内で毎回これを行う必要がないためです。

17
BalusC

コードは正しく見えますが、非常に一般的で簡単なエラーは、画面に出力されたものを文字列の内容と間違えることです。文字列がまだ正しく読み取られていないかどうかをデバッガーで確認してください。

2
Magnus

メモ帳は特殊記号を正しく保存しません。同様の問題が発生し、代わりにNotepad ++を使用して、そこからUTf-8エンコーディングを選択しました。これを行ったとき、メモ帳でテキストファイルを作成したときとは異なり、文字列ライブラリメソッドを適用したときにプログラムがクラッシュしなくなりました。

1
user929404

メモ帳では、ASCII以外の文字を処理できない場合があります。別のテキストエディタを試してください。 Windowsのインストールで利用できるものに固執したい場合は、ワードパッドを試してください。

サーブレットの要求/応答の一部として変換という文字を使用していますか?はいの場合、request.setEncoding("UTF-8")
または
response.setCharacterEncoding("UTF-8")

あなたの目的を解決する必要があります。

0
Darshan Kumar
"Not all sequences of bytes are valid UTF-8."

見る

http://en.wikipedia.org/wiki/UTF-8

具体的な詳細については、「無効なバイトシーケンス」を参照してください。

0
xagyg