FileWriterは何とか中国語で書きます

OblivionSword:

この問題で私を助けてください。私は.txtファイルを読み込み、それがファイル内の各文字の頻度をカウントするコードを記述しようとしています。これは私が思い付いたものです:

public static void charCount(String file) throws IOException {
        FileReader fr = new FileReader(file);
        BufferedReader br = new BufferedReader(fr);

        int[] count = new int[26];
        String line;
        while ((line = br.readLine()) != null) {
            line = line.toUpperCase();
            char[] characters = line.toCharArray();
            for (int i = 0; i < line.length(); i++) {
                if ((characters[i] >='A') && (characters[i] <='Z')) {
                    count[characters[i] - 'A']++;
                }
            }
        }
        File file2 = new File("D:/Project/Aufgabe/Winter_2019/frequency.txt");
        file2.createNewFile();
        FileWriter fw = new FileWriter(file2);
        for (int i = 0; i < 26; i++) {
            fw.write(((char)(i + 'A')) + ": " + count[i]);
        }
        fw.close();
        br.close();
    }

私はのSystem.out.println()を使用してコンソールに結果を印刷しようとしたとき、それはこれらの結果から得られます。

A: 15
B: 4
C: 9
D: 10
E: 2
F: 1
G: 0
H: 3
I: 5
J: 6
K: 3
L: 0
M: 2
N: 7
O: 3
P: 1
Q: 1
R: 0
S: 4
T: 0
U: 2
V: 0
W: 5
X: 0
Y: 1
Z: 0

これは私が欲しいものです。私は、ファイルに書き込むしようとしたときしかし、それは.txtファイルにそれを、これらの結果を与えます:

㩁ㄠ䈵›䌴›䐹›〱㩅㈠㩆ㄠ㩇〠㩈㌠㩉㔠㩊㘠㩋㌠㩌〠㩍㈠㩎㜠㩏㌠㩐ㄠ㩑ㄠ㩒〠㩓㐠㩔〠㩕㈠㩖〠㩗㔠㩘〠㩙ㄠ㩚〠

私はまだJavaへの新たなんだ、そうヘルプははるかに高く評価されるだろう。

ローター:

改善することができるあなたのプログラムに関するものがいくつかありますが、それらのどれを使用すると、中国語の文字を参照してください理由はありません。実際には、あなたのプログラムがうまく動作するようだと、結果のファイルが実際にそれをしようとしたとき、あなたが見てきたテキストが含まれていますSystem.out.println

私は、あなたの出力例をコピーし、メモ帳を使用して新しいファイルにそれを貼り付けして保存した後、(ここではHXD)HEXエディタを使用してファイルを見て持っていました。このように開始したHEXデータ:へのFF FE 41 3A 20 31 35 42 ... "並進" ÿþA: 15B...それはまさにあなたの期待される結果に加えてファイルを保存しながら、メモ帳で作成されたBOM(バイトオーダーマーカー)だと、元のデータの一部で、そのためではありません。

なぜあなたは奇妙な結果を見ていますか?その理由は、あなたのプログラムが、あなたが使用しているテキストビューアではありません。ファイルは、(Windowsのメモ帳の場合)かどうかを判断するためにBOMを逃した場合は、これらの試みの多くは、ファイルがCP1252して読まれるべきであり、推測を行うには(Windowsのラテン1)、UTF-8またはUnicode / UTF-16。それはあなたの視聴者が、これはUTF-16であるかもしれないことを決めた理由を言うのは難しいですが、それはそれは方法ですので、異なるアルゴリズムがあります;-)

私は変更するかもしれない推測し、あなたの問題の修正を持っています

fw.write(((char)(i + 'A')) + ": " + count[i]);

fw.write(((char)(i + 'A')) + ": " + count[i] + "\r\n");

またBOM、例えばUTF-8またはUTF-16を含んでいる文字セットを使用してファイルを書き込みます。Javaの11を使用すると、していることを行うことができFileWriterますは、Javaの古いバージョンを使用する必要がある場合は、直接(そのセットにできる新しいコンストラクタがある)、あなたが使用する必要がありますOutputStreamWriter

OutputStreamWriter fw = new OutputStreamWriter(new FileOutputStream(file2), "UTF8");

また:-dialogはあなたが明示的に文字コードを指定することができ、「ファイルを開く」、ドイツ語版のWindowsシステム上のメモ帳は、オプションを呼び出す「Codierung」と「ANSI」は「CP1252」(文字セットあなたのJava仮想マシンすべきであるならば、あなたのテキストビューアをチェック使用する際に使用しているFileWriter特定の文字セットなし)。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=330667&siteId=1