質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Q&A

解決済

1回答

3984閲覧

Rust:Shift-JIS(cp932・Windows-31J)でCSV出力

m_osa

総合スコア4

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

0グッド

1クリップ

投稿2021/12/29 14:15

編集2021/12/30 13:35

前提・実現したいこと

Rustを使って、Shift-JISのCSVを読み込み・加工後、Shift-JIS(cp932・Windows-31J)でCSV出力
したいと考えております。

発生している問題・エラーメッセージ

UTF-8では出力できているのですが、Shift-JISで出力できず困っております。 まだRustの学び始めで、あまり理解できていない部分が多く申し訳ないのですが、出力できる方法をご教授いただきたく お願いします。 ※色々と検索してみたのですが、Shift-JISでの出力方法を記載しているような情報を見つけることができていません。 ※勝手を言って申し訳ございませんが、より高速出力できる方法があれば、ご教授いただけると幸いです。

該当のソースコード

Rust

1 # 以下の”text”のType 2 # encoding_rs_io::DecodeReaderBytes<std::fs::File, std::vec::Vec<u8>> 3 4 let mut outfile = 5 BufWriter::new(fs::File::create("test.txt").unwrap()); 6 let mut reader = BufReader::new(text); 7 8 loop { 9 let mut buf = String::new(); 10 let num_bytes = reader.read_line(&mut buf).unwrap(); 11 12 ## UTF-8Shift-JISに変換する処理 ## 13 14 if num_bytes == 0 { 15 break; 16 } else { 17 outfile.write(buf.as_bytes()).unwrap(); 18 } 19 } 20

試したこと

上記の「UTF-8 → Shift-JISに変換する処理」の部分に以下のようなコードを試してみましたが、
上手くいっておりません。decodeの第一引数には&[u8]をセットしないといけないことは分かったのですが、
この処理をどのように使用すればよいのかがよく分かっていません。

let buf = WINDOWS_31J.decode(buf, DecoderTrap::Strict).unwrap();

・使用したクレート
use std::fs;
use std::fs::File;
use std::*;
use std::io::{self, BufRead, BufReader, BufWriter, Write};
use std::path::Path;
use encoding_rs::SHIFT_JIS;
use encoding_rs_io::DecodeReaderBytesBuilder;

補足情報(FW/ツールのバージョンなど)

・Windows10
・rustc 1.57.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

equal-l2

2021/12/30 11:51

「該当のソースコード」や「試したこと」で使用しているクレートを明示してください。
m_osa

2021/12/30 13:36

ご返信いただき、ありがとうございます。 「試したこと」に使用クレートを追記し、併せてコードを少し修正しました。
actorbug

2021/12/31 00:04

単独でコンパイルできる完全なコードを載せた方が、回答は付きやすいと思います。 あと2点ほど気になることがあります。 ・使用したクレートに encoding_rs::SHIFT_JIS とあるのに、実際に使おうとしているのが WINDOWS_31J なのはなぜ? ・decode は utf-8 以外から utf-8 への変換なので、utf-8 から Shift-JIS へ変換したいなら encode を使うべきでは?
guest

回答1

0

ベストアンサー

SHIFT_JIS.decodeは(Cow<'a, str>が返ってくることから分かるように)「Shift-JISをUTF-8に変換する」関数です。従って、今やりたいこととは逆になります。

代わりに、SHIFT_JIS.encodebufを渡してやれば「UTF-8からShift-JISへの変換」を行えるはずです。

投稿2021/12/31 00:05

編集2021/12/31 00:07
equal-l2

総合スコア172

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m_osa

2021/12/31 02:33

ありがとうございました。無事Shift-JISで出力できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問