14

UTF-8 でエンコードされたファイル (Windows のテキスト エディターで作成したファイル) を読み取り、文字を画面に表示する jar ファイルがあります。OS X および Linux では、これは問題なく動作します。ただし、Windowsで動作させるのに少し問題があります...リーダーとライターを次のように定義しました:

FileInputStream file = new FileInputStream(args[0]);
InputStreamReader reader = new InputStreamReader(file, "UTF8");

PrintStream writer = new PrintStream(System.out, true, "UTF8");

また、コマンド プロンプトのフォントをLucida Consoleに、文字エンコーディングを のchcp 65001順に UTF-8 に変更しました。

今、私が実行するjava -jar Read.jar file.txtと、プロンプトはこれを吹き飛ばします。

áéí
ñóú
[]óú
[]

ただし、 を実行するtype file.txtと、プロンプトにファイルの内容が正しく表示されます。

áéí
ñóú

ファイルを BOM 付きまたは BOM なしで保存しようとしましたが、違いはありませんでした。(UTF-8 はエンディアンがないので BOM も必要ありませんよね?) でコンパイルしてみましjavac -encoding utf8 *.javaたが、同じことが起こります。

私は今アイデアがありません。誰か助けてくれませんか?

4

3 に答える 3

16

コード ページ 65001 が壊れています。MS C ランタイムの stdio 関数は、65001 で実行した場合に読み書きされたバイト数を不正確に返すため、このような奇妙な動作が発生します。

これは修正できません。C stdlib バイト I/O 関数 (Java を含む) を使用するアプリケーションからの Unicode I/O に Windows コンソールを確実に使用することはできません。Win32 API 関数 WriteConsoleW を呼び出して Unicode コンテンツをコンソールに直接取得することでハッキングできますが、stdout が実際にコンソールである (ファイルにリダイレクトされない) ことを検出することについて心配する必要があります。

これは、MS が修正することに関心を示さない、長年にわたる問題の原因です。

于 2012-08-13T08:34:57.173 に答える
0

BufferReaderを使用して、このようにファイルを読み取ってみてください。

   BufferedReader in = new BufferedReader(
       new InputStreamReader(
                  new FileInputStream(file), "UTF8"));
于 2012-08-13T09:23:15.010 に答える
0

改行文字の可能性があります。標準英語 ISO-8859-1 で改行文字を作成する場合、char[] 配列を使用します。これは、Windows 文字 '\r' および '\n' と UNIX/Linux は改行文字として \r のみであるためです。Win 4 バイト、UNIX 2 バイト。文字コンバーター クラスの API ドキュメントでは、エンコーディング変換システムは、エンコーディングと文字サイズの要件に応じて、破棄するために偽のバイトが残っている可能性があります。

于 2012-08-13T02:39:20.460 に答える