WindowsからLinux間でテキストファイルの送信を行うとエンコード等で問題が出てくることがあります。
Windowsで作成したファイルがShift_JISだったり、改行コードがCRLFだったり…。
文字コード:Shift_JIS+改行コード:CRLFから文字コード:UTF-8+改行コード:LFにする方法をまとめてみました。
nkfで変換する場合
文字コード変換としてよく使用されているnkfです。CentOSで入っていない場合yumでインストールできます。
#yum install nkf
使い方
nkf -Lu -x -w80 【変換元ファイル】 > 【保存先ファイル】
-w80はBOMなしUTF-8です。シェルスクリプトではBOMありファイルは正常に読み子もない場合があるのでBOMなしが無難なようです。
-xをつけないと半角カナが全角カナに変換されるようなので注意
BOMありを選ぶならば-w8 でいけるようです。
上書き保存する場合は--overwriteが必要。
nkf -Lu -x -w80 --overwrite【変換元ファイル】
--overwriteを指定せず変換元と保存先を同じにすると中身が空っぽになるので注意。
他にも色々引数の設定ができるみたいなので次回以降にまとめようと思います。
vimで変換する場合
nkfコマンドが入っていない場合、vimで代用することもできます。
vimで保存元ファイルを開き、文字化けが発生している場合は文字化けを直します。
読み込み
まずはvimでファイルを読み込み、「:e」コマンドで文字コードを指定して再表示します。
文字コード:拡張Shift_JISで再読み込み
:e ++enc=ms932
改行コード:CRLFで再読み込み
:e ++ff=dos
改行コードは下記の通りで指定します。
- dos…Windows形式(CRLF)
- mac…Mac形式(CR)
- unix…Unix形式(LF)
変換
文字化け、改行コードを修正したらフォーマットを変更します。
文字コード:UTF-8に変換
:set fileencoding=utf-8
改行コード:LFに変換
:set fileformat=unix
BOMなしに変換
:set nobomb
bomb?…BOMの有無確認
bomb…BOM付きに変換
nobomb…BOMなしに変換
その他
fileencodingをfenc、fileformatをffと略すことも可能みたいです。
別ファイルに保存したい場合は:w 【保存先ファイル】で保存することができます。
vimの場合:wを押すまで設定した文字コードや改行コードが反映されないので注意。
iconvで変換する場合
RedHatにインストールされているiconvでも変換することができます。
使い方
iconv -f SJIS -t UTF8 【変換元ファイル】 -o 【保存先ファイル】
一番シンプル。しかし、シンプルな為に色々できないっぽいです。
改行コードの変換ができない、BOMを付けたり消したりできない。
さらに変換元ファイルがUTF-8の場合BOM有りだとエラーになる等々
もちろん上書きもできません。
変換に失敗する文字列も存在する
全ての文字がきちんと変換できるっていうわけでもないです。
SJISのCSVファイルをEXCELで開き、環境依存文字を入力するとか(そもそも保存時に文字化けするけど)
チルダ問題とか
MACの濁点問題とか
外字なんてきたらどうしようもない(自作スクリプト作るぐらいしか対応なし?)
変換する際は変換前文字がどうなってるのか確認してから変換するのがベストだと思います。
改行コードぐらいなら問題なさそうですけどね。