読者です 読者をやめる 読者になる 読者になる

長生村本郷Engineers'Blog

千葉県長生村本郷育ちのエンジニアが書いているブログ

CSVエンコード問題解決

mutt CentOS

f:id:kenzo0107:20160909105642j:plain

概要

Linux サーバで DBで集計してCSVファイルをレポートする
なんてことがあるかと思います。

CSVファイルを Linux サーバで作成し
Windows, Mac にメール添付して送信すると
どちらもCSVファイルを開くと文字化けしてしまう問題に遭遇しました。

この問題を解決すべく調査しました。

そもそも何で文字化け?

CSVファイルはWindows, Macでは基本Excelが起動し開きますが
デフォルト Shift_Jis として開こうとします。

テキストファイルに一旦開いてコピーしてエクセルに貼り付ける対策を紹介しているブログもありましたが
クライアント様がお相手となる場合やファイルサイズが非常に大きい場合は
一手間かける方法はNGです。

調査1 文字コードを変更してから mutt でメール添付送信

  1. 文字エンコードnkf : Network Kanji Filter Version 2.0.7 (2006-06-13)
  2. メール送信は mutt 1.4.2.2i
  3. mutt の設定ファイルをいじりましたがうまくいかなかったです。

Shift_JIS

$ echo '大崎,yoshi,浜田,moto,松本' > sjis.csv
$ nkf -g sjis.csv
UTF-8

$ nkf -s --overwrite sjis.csv
$ nkf -g sjis.csv
Shift_JIS

$ echo "Shift_JIS だよ" | mutt -n -s "Shift_JIS CSV 添付" "kenzo.tanaka0107@gmail.com" -a sjis.csv
  • メール受信し添付ファイルをダウンロードし文字コードチェック
$ nkf -g sjis.csv
UTF-8

あれ? Shift_JISエンコードして送ったんだけど UTF-8 になってる

f:id:kenzo0107:20160909102427p:plain

JIS (ISO-2022-JP)

$ echo '大崎,yoshi,浜田,moto,松本' > jis.csv
$ nkf -j --overwrite jis.csv
$ nkf -g jis.csv
ISO-2022-JP

$ echo "JIS だよ" | mutt -n -s "JIS CSV 添付" "kenzo.tanaka0107@gmail.com" -a jis.csv
  • メール受信し添付ファイルをダウンロードし文字コードチェック
$ nkf -g jis.csv
ISO-2022-JP

ISO-2022-JP文字コードが変更されず送信されたけど...
やっぱり文字化け...

f:id:kenzo0107:20160909102720p:plain

UTF-8

$ echo '大崎,yoshi,浜田,moto,松本' > utf8.csv
$ nkf -w --overwrite utf8.csv
$ nkf -g utf8.csv
UTF-8

$ echo "UTF-8 だよ" | mutt -n -s "UTF-8 CSV 添付" "kenzo.tanaka0107@gmail.com" -a utf8.csv
  • メール受信し添付ファイルをダウンロードし文字コードチェック
$ nkf -g utf8.csv
UTF-8

当然文字化け...

f:id:kenzo0107:20160909102942p:plain

UTF-8 BOM付き

$ echo '大崎,yoshi,浜田,moto,松本' > utf8-bom.csv
$ nkf --overwrite -oc=UTF-8-BOM utf8-bom.csv
$ nkf -g utf8-bom.csv
ISO-2022-JP

$ echo "UTF-8-BOM だよ" | mutt -n -s "UTF-8-BOM CSV 添付" "kenzo.tanaka0107@gmail.com" -a utf8-bom.csv
  • メール受信し添付ファイルをダウンロードし文字コードチェック
$ nkf -g utf8-bom.csv
ISO-2022-JP

JISと同様の結果...

f:id:kenzo0107:20160909103228p:plain

EUC

$ echo '大崎,yoshi,浜田,moto,松本' > euc.csv
$ nkf -e --overwrite euc.csv
$ nkf -g euc.csv
EUC-JP

$ echo "EUC だよ" | mutt -n -s "EUC CSV 添付" "kenzo.tanaka0107@gmail.com" -a euc.csv
  • メール受信し添付ファイルをダウンロードし文字コードチェック
$ nkf -g euc.csv
EUC-JP

ファイルエンコードではうまくいきませんでした。

f:id:kenzo0107:20160909110133p:plain

調査2 BINARYファイルにしてみる

もっと具体的にいうと 圧縮ファイルを送ってみる

Shift_JISCSVが開かれるのでShift_JISエンコードします。

$ echo '大崎,yoshi,浜田,moto,松本' > sjis.csv
$ nkf -s --overwrite sjis.csv
$ zip sjis.zip sjis.csv
$ nkf -g sjis.zip
BINARY

$ echo "ZIP だよ" | mutt -n -s "ZIP 添付" "kenzo.tanaka0107@gmail.com" -a sjis.zip
  • メール受信し添付ファイルをダウンロードし文字コードチェック
$ nkf -g sjis.zip
BINARY

$ unzip sjis.zip
$ nkf -g sjis.csv
Shift_JIS

Shift_JIS のままダウンロードできてる!
これは期待できそう!

うまくいった! f:id:kenzo0107:20160909104652p:plain

総評

  • Windows, Mac で送られてきたCSVファイルで文字化けせず開くことができました。
  • 圧縮した方が容量を下げて通信が行えるのでよくなりました。