🌈
Rust | encoding_rs で Shift-JIS の CSV ファイルを書き出す
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 がイイな🐻🐻🐻
-
encoding_rs の README に「encoding_rs is used in Gecko starting with Firefox 56.」と記載がある。 ↩︎
Discussion