スポンサーリンク

SJISファイルを読み込むと「警告: 無効なマルチバイト・・・」が表示

※awkの使い方をまとめて一覧にしました。
参考:awk入門-使い方まとめ一覧-

※MACターミナル(BSD系)での動作確認です。

例えば、下記のin.txtがあったとします。
(SJISです)

$ cat in.txt 
漢字漢字 1
ひらがな 2
カタカナ 3

下記がサンプルコードになります。
参考:awkでsubstr()を使って文字列を切り出す方法
$ cat sample.awk 
#!/bin/sh
cat in.txt | gawk '		
	{
		num = substr( $1, 2, 2)
		print num , $2
	}
'

下記が実行結果になります。
うまく処理できていないですね。
$ ./sample.awk 
gawk: コマンドライン:3: (FILENAME=- FNR=1) 警告: 無効なマルチバイトデータが検出されました。データとロケールが一致していないようです。
?? 1
Ђ炪 2
J? 3

スポンサーリンク

入力ファイルをUTF-8にする

入力ファイルをUTF-8に変換します。
参考:nkfで、UTF-8 改行コードLFに変更する(上書き)

nkfが便利ですね。
--overwriteで上書きです。

$ nkf -w --overwrite in.txt 

下記が実行結果になります。
うまく処理できたようです。
$ ./sample.awk 
字漢 1
らが 2
タカ 3

参考:SJISの表示でMACターミナルが文字化けした時の対策
・MACターミナルの表示にも影響が出ますね。
今の時代、UTF-8にしておくのが無難だと思います。

 

※読者の方からご指摘頂きました。ありがとうございました。
読者の方から、「警告が出るのは、ターミナルがUTF-8になっているから」とのご指摘を頂きました。
これはご指摘の通りです。ターミナルのエンコーディングをShift JISに変更すると、警告は消えます。

具体的な方法としては、下記の通りです。
「ターミナル」-> 「プロファイル」->「環境設定」-> 詳細 -> 言語環境のテキストエンコーディング
ここで、Shift JISを選択

ただ、MACターミナルのデフォルトはUTF-8ですし、UTF-8で扱っていく方が問題に遭遇する場面が減ると考えています。なので、今回は、UTF-8に変換して統一する方法を記載した次第です。

お問い合わせ頂きまして、ありがとうございました。
この場を借りてお礼申し上げます。

スポンサーリンク