🌈

Rust | encoding_rs で Shift-JIS の CSV ファイルを書き出す

2024/08/27に公開

Rust でエンコーディングするなら encoding_rs

Rust でエンコーディングをおこなう場合、encoding_rs というクレートがデファクトスタンダードのようです。

この encoding_rs は Firefox でも使用されているレンダリングエンジン Gecko でも使われているそうです。[1]

Shift-JIS の CSV ファイルを書き出す

Rust で Shift-JIS の CSV ファイルを書き出す処理を実装してみます。

Cargo.toml

Cargo.toml
[dependencies]
encoding_rs = "0.8.34"

main.rs

csv のような CSV を扱うクレートと組み合わせていきたいところですが、
今回はカンマ区切りの文字列を書き出す仕様で実装します。

エンコード処理は SHIFT_JIS.encode() です。

あとはエンコードした文字列を BufWriter で書き込んでいます。

main.rs
use std::fs::File;
use std::io::{BufWriter, Write};
use encoding_rs::SHIFT_JIS;

// CR+LF: Windows OS
const NEW_LINE_CODE: &str = "\r\n";

fn main() -> std::io::Result<()> {
    let path = "サンプルデータ.csv";

    // 書き込み専用で開く
    let f = File::create(path)?;
    let mut bfw = BufWriter::new(f);

    let records = vec![
        "山の名前,山の名前(かな),標高",
        "富士山,ふじさん,3776",
        "北岳,きただけ,3193",
        "奥穂高岳,おくほたかだけ,3190",
        "間ノ岳,あいのだけ,3190",
        "槍ヶ岳,やりがたけ,3180",
    ];

    for r in records {
        let text = format!("{}{}", r, NEW_LINE_CODE);
        let (encoded, _, _) = SHIFT_JIS.encode(&text);
        let _ = bfw.write(&encoded)?;
    }

    Ok(())
}

VSCode で書き出したファイルを確認してみます。

UTF-8 では良い感じに文字化けしています。

エンコードを Shift-JIS 指定で開くと文字化けが解消されました👏👏

まとめ

CSV は UTF-8 がイイな🐻🐻🐻

脚注
  1. encoding_rs の README に「encoding_rs is used in Gecko starting with Firefox 56.」と記載がある。 ↩︎

コラボスタイル Developers

Discussion