Java

CSVファイル UTF-8→SJIS変換 & 文字化け検知 [Java]

この記事で分かること

  • CSVファイルの文字コードを変換して別のファイルに出力する方法
  • 文字化けが発生する文字を検知する方法

この記事では、CSVファイルを読み込み UTF-8からShift-JISに文字コードを変換して、別のCSVファイルに出力するサンプルプログラムを紹介します。(BufferedReader / BufferedWriter クラスを使用)

UTF-8からShift-JISに文字コードを変換する際に、文字化けが発生しないか心配になることはありませんか?

このプログラムでは、変換途中に文字化けの発生有無をチェックして、文字化けが発生する場合はログに出力するようになっています。

具体的には、CharsetEncoder を用いて文字化けを判定する処理を採用しています。

ゴイチ

それでは、早速次の章で実際のサンプルコードをご覧ください。

サンプルコード

import java.io.*;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
import java.nio.charset.StandardCharsets;

public class ConvertCsv {
    public static void convertCsv(String srcPath, String destPath) throws IOException {
        File srcFile = new File(srcPath);
        Charset srcCharset = StandardCharsets.UTF_8;
        File destFile = new File(destPath);
        Charset destCharset = Charset.forName("SJIS");
        CharsetEncoder encoder = destCharset.newEncoder();
        
        try (BufferedReader br = new BufferedReader(new FileReader(srcFile, srcCharset))) {
            try (BufferedWriter bw = new BufferedWriter(new FileWriter(destFile, destCharset))) {
                String line;

                while ((line = br.readLine()) != null) {
                    // 文字化け判定
                    if (!encoder.canEncode(line)) {
                        // 文字化けが発生する行をログに出力
                        System.out.println(line);
                    }

                    // ファイルに一行書き込み
                    bw.write(line);
                    // 環境に合わせた改行文字を書き込み
                    bw.newLine();
                }
            }
        }
    }
}

解説

try-with-resourcesBufferedReader / BufferedWriter をオープンしたら、

while ((line = br.readLine()) != null) 

の行で、ファイルを一行ずつ読み出し、

if (!encoder.canEncode(line))

の行で、文字化けが発生するかをチェックしています。

bw.write(line)

の行で、文字コードを自動的に変換しつつファイルに一行書き込みます。

bw.newLine()

は、実行される環境に合わせた改行コードを出力する便利なメソッドです。

文字化けとは?

そもそも、文字化けが発生するメカニズムが知りたいという方は、以下の記事をオススメします。

【超初心者向け】文字コードとは何なのか?

この記事では、超初心者向けに文字コードとは何か?について解説しています。 プログラミングに限らず、パソコンやコンピュータを使っていれば誰でも文字化けが発生した経験があると思います。 今回は、プログラミ ...

続きを見る

また、Javaでの UTF-8 -> SJIS 変換をもっと詳しく知りたい方は、以下の記事も参考にしてみて下さい。

UTF-8 / SJIS 文字コード変換できない文字を検知する [Java]

文字コードを変換する際に、UTF-8 には存在するが Shift-JIS には存在しないという文字がある場合、文字化けが発生します。 環境依存文字やサロゲートペア文字と言われているものが代表的ですが、 ...

続きを見る

注意点

FileReader/FileWriterのコンストラクタで文字コードを渡すバージョンは JDK 11 以上が必要なので、JDK11未満の環境の方は以下の記事のファイル操作方法も参考にしてみて下さい。

【オススメあり】Javaでファイル操作する方法の徹底比較 (JDK標準 / Apache Commons / Google Guava)

この記事では、Javaでファイルの読み出し/書き込みをする際に利用できるライブラリを紹介します。 Javaではファイル操作をする方法が複数あって、どれを使えば良いか迷いますよね?このページでは、JDK ...

続きを見る

今回の例は Javaですが、もちろん Kotlin でも同様に処理できると思います。

まとめ

最後に、この記事の内容をまとめます。

要点

  • BufferedReader / BufferedWriter を使用したファイル操作を紹介しました
  • 文字化けの検知は、CharsetEncoder クラスを利用すると便利です
  • CSVファイル以外のファイル操作にも応用可能です

少しでも参考になりましたら幸いです。

ゴイチ

それでは、また他の記事でお会いしましょう!

この記事は役に立ちましたか?

  • この記事を書いた人
アバター画像

ゴイチ

ソフトウェアエンジニア歴20年。 C/C++、Java、C#、Kotlinが得意で、組込系からAndroidアプリ、大規模なWebサービスなど幅広いプログラミング経験があります。 現在は某SNSの会社でWebエンジニアをしています。

-Java
-, ,