3

良い一日。

スペイン語の ASCII ファイルがあります。これらには、A から Z までの文字と Ñ、ASCII コード 165 ( http://www.asciitable.com/ ) のみが含まれます。このソース コードでこのファイルを取得します。

InputStream is = ctx.getAssets().open(filenames[lang_code][w]);
InputStreamReader reader1 = new InputStreamReader(is, "UTF-8");
BufferedReader reader = new BufferedReader(reader1, 8000);

try {
    while ((line = reader.readLine()) != null) {
                 workOn(line);
                 // do a lot of things with line
            }
    reader.close();
    is.close();
} catch (IOException e) { e.printStackTrace(); }

ここで workOn() と呼んだのは、文字列から文字コードを抽出する関数で、次のようなものです。

    private static void workOn(String s) {      
    byte b;
    for (int w = 0; w < s.length(); w++) {
        b = (byte)s.charAt(w);
                    // etc etc etc
            }
}   

残念ながら、ここで起こることは、b が Ñ 文字を表している場合、b を ASCII コードとして識別できないことです。b の値は任意の ASCII 文字に対して正しく、Ñ を処理する場合は -3 を返します。これは符号付きで 253、または ASCII 文字 ² です。Ñに似たものは何もありません...

そこで何が起こるの?この単純な ASCII コードを取得するにはどうすればよいですか?

私を怒らせているのは、正しいコーディングが見つからないことです。でも、UTF-8 テーブル ( http://www.utf8-chartable.de/ ) をブラウズすると、Ñ は 209dec、253dec は ý、165dec は ¥ です。繰り返しますが、必要なものに関連するイベントではありません。

だから…助けてください!:(

4

1 に答える 1

8

読んでいるソース ファイルが UTF-8 でエンコードされていることを確認してください。UTF-8 エンコーディングでは、127 より大きい値はすべてマルチバイト シーケンス用に予約されており、単独で表示されることはありません。

あなたが読んでいるファイルは、元の IBM PC 文字セットである「コード ページ 237」を使用してエンコードされていると思います。その文字セットでは、Ñ は 10 進数の 165 で表されます。

最近のシステムの多くは、たまたま Unicode 文字セットの最初の 256 文字に相当する ISO-8859-1 を使用しています。それらでは、Ñ 文字は 10 進数の 209 です。コメントで、作成者は 209 が実際にファイルにあることを明らかにしました。

ファイルが実際に UTF-8 でエンコードされている場合、Ñ は 2 バイトのシーケンスとして表され、値 165 でも値 209 でもありません。

ファイルが ISO-8859-1 でエンコードされているという上記の仮定に基づいて、次を使用して状況を解決できるはずです。

InputStreamReader reader1 = new InputStreamReader(is, "ISO-8859-1");

これは Unicode 文字に変換され、10 進数の 209 で表される文字 Ñ が見つかるはずです。

于 2013-02-14T22:57:11.593 に答える