Avatar
1
monkey Enlightened
monkey Enlightened
Ghi file csv ở dạng Shift JIS
Example:

public class OutputSjis {

    private final static byte CR = 0x0d; // 13
    private final static byte LF = 0x0a; // 10

    public static void main(String[] args) {
        output();
    }

    /**
     * sjisファイル出力処理

     * 参考サイト
     * <li>http://www.ne.jp/asahi/hishidama/home/tech/java/files.html
     */
    private static void output() {
        // 出力先のディレクトリ。無ければ親を含めて作成する
        Path dir = Paths.get("work");
        if (Files.notExists(dir)) {
            try {
                Files.createDirectories(dir);
            } catch (IOException e) { }
        }

        // 出力先のファイル
        Path path1 = dir.resolve("sjis1.txt");
        Path path2 = dir.resolve("sjis2.txt");
        Path path3 = dir.resolve("sjis3.txt");
        Path path4 = dir.resolve("sjis4.txt");

        File file1 = path1.toFile();
        File file2 = path2.toFile();

        // 仮データ作成
        List dataList = new ArrayList();
        dataList.add("あいうえお");
        dataList.add("~"); // 良く文字化けするやつ
        dataList.add(" "); // MS932では変換出来ない文字(ソースファイルはUTF8である必要がある)
        dataList.add("かきくけこ");
        dataList.add("~-¢£¬―∥");

        // 【パターン1】元データがByteで来る場合を想定
        try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file1))) {
            for (String data : dataList) {
                // 「MS932」はエイリアスで、正式名は「windows-31j」
                // 「SJIS」はエイリアスで、「Shift_JIS」が正式名
                byte[] bb = data.getBytes(Charset.forName("MS932"));
                bos.write(bb);
                bos.write(CR); // CR
                bos.write(LF); // LF
                bos.flush();
            }
        } catch (IOException e) { }

        // 【パターン2】元データがStringで来る場合を想定
        try (PrintWriter pw = new PrintWriter(
            new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file2), Charset.forName("MS932"))))) {

            for (String data : dataList) {
                pw.println(data);
            }
        } catch (IOException e) { }

        // 【パターン3】パターン1は、java8ではこう書ける
        try (OutputStream os = Files.newOutputStream(path3)) {
            for (String data : dataList) {
                byte[] bb = data.getBytes(Charset.forName("MS932"));
                os.write(bb);
                os.write(CR); // CR
                os.write(LF); // LF
                os.flush();
            }
        } catch (IOException e) { }

        // 【パターン4】パターン2は、java8ではこう書ける
        // ただし、パターン2ではエンコード出来ない文字が?で出力されるのに対して、こっちはUnmappableCharacterExceptionが投げられる
        try (BufferedWriter bw = Files.newBufferedWriter(path4, Charset.forName("MS932"))) {
            for (String data : dataList) {
                bw.write(data);
                bw.newLine();
            }
        } catch (IOException e) { }
    }
}

Nguồn: hatenablog.com

  • Answer
java shift jis sjis
Remain: 5
1 Answer
Avatar
Mục đích ghi shift jis để làm gì ạ
  • 0
  • Reply
Đây là bảng mã bên Nhật họ hay dùng em ạ, phải chuyển về thì họ mới đọc được, vì các công cụ đọc của họ sẽ mặc định dùng shift jis  –  monkey 1638308541000
tiếng Nhật có quy tắc như tiếng anh k ạ, có khác gì dùng i18n không ạ  –  Nguyễn Thái Sơn 1638325237000