IO 操作についてはあまり詳しくありません。 。 。コーディングや文字化けの知識もほとんどありません。 。 。今日、ファイルのエンコーディングを変換し、元の GBK エンコーディングなどのエンコードされた文字列を UTF-8 に変換して返すという要件に遭遇しました。
このうち、BytesEncodingDetect クラスは掲載されません。主にファイルのエンコード形式を取得するために使用されます。
まず、ソースファイルで直接エンコード方法を変更し、URLEncoderとURLDecoderを使用して変換しようとしましたが、それでも機能しませんでした。中国語の奇数の最後の文字が文字化けします。
Baidu は解決策を探しましたが失敗したため、私のアイデアを採用する必要がありました。まずソース ファイルの内容を読み取り、それを StringBuffer に保存し、次にソース ファイルを削除し、新しいファイルを作成して別のファイルに保存します。エンコード形式。
エンコード後のエフェクトを表示する: Eclipse ではエフェクトを表示しないように注意してください。Eclipse はエンコード形式でのみ表示するため、ブラウザ側で HTML ファイルを表示するには、右クリックします。エンコードして成功したかどうかを判断します。
次のようにコードをコピーします。
パッケージ com.test;
java.io.BufferedReaderをインポートします。
インポート java.io.BufferedWriter;
java.io.ファイルをインポートします。
java.io.FileInputStreamをインポートします。
java.io.FileOutputStreamをインポートします。
java.io.InputStreamをインポートします。
インポートjava.io.InputStreamReader;
java.io.OutputStreamをインポートします。
インポートjava.io.OutputStreamWriter;
java.net.URLDecoderをインポートします。
java.net.URLEncoderをインポートします。
パブリック クラス トランスコーディング {
private BytesEncodingDetect エンコード = new BytesEncodingDetect();
パブリックトランスコーディング() {
}
/**
* コード変換
* @param toCharset 変換するエンコーディング
* @param path 変換するファイルパス
* @戻る
* @throwsException
*/
public String エンコーディング(String toCharset, String path) が例外をスローします{
ファイル srcFile = 新しいファイル(パス);
int インデックス = encode.detectEncoding(srcFile);
文字列文字セット = BytesEncodingDetect.javaname[インデックス];
// エンコーディングは同じなので、トランスコードする必要はありません
if (charset.equalsIgnoreCase(toCharset)) {
return "エンコーディングは同じなので、変換は必要ありません";
}
入力ストリーム = 新しい FileInputStream(パス);
BufferedReader br = new BufferedReader(
新しいInputStreamReader(in, charset));
StringBuffer sb = new StringBuffer();
文字列 s1;
while ((s1=br.readLine())!=null) {
文字列 s = URLEncoder.encode(s1, toCharset);
sb.append(s+"/r/n");// 1 行 + キャリッジリターン
}
br.close();
srcFile.delete();//元のファイルを削除
// 新しいエンコーディングでファイルを書き換えて値を返します
File newfile = new File(path);//元のファイルを再構築します
newfile.createNewFile();
OutputStream out = 新しい FileOutputStream(newfile);
OutputStreamWriter ライター = new OutputStreamWriter(out, toCharset);
BufferedWriter bw = 新しい BufferedWriter(ライター);
bw.write(URLDecoder.decode(sb.toString(), toCharset));
文字列結果 = URLDecoder.decode(sb.toString(), toCharset);
bw.flush();//ファイルにフラッシュします
bw.close();
結果を返します。
}
}