Table of Contents
文字化けと文字コード
Linuxで共有されたファイルを扱うとき, 時折文字化けが発生することがあります. これは, 多くの場合そのファイルの文字コードや改行コードが適切に読み込めていないことに起因します.
このポストでは文字コード/改行コードをUTF-8とLFへ統一するためのコマンドnkfを紹介します.
なお, 文字コードを変換するコマンドはiconvもありますが, こちらは改行コード変換機能はありません.
改行コード
改行文字という不可視文字をコンピュータ上で表す場合はキャリッジリターン(CR)やラインフィード(LF),
またはこれらの組み合わせ(CR+LF)などの制御文字と呼ばれる特殊な文字が使用されています.
ファイルがUTF-8を使用していたとしても改行コードは異なる場合があるため, 異なるシステム間でのデータの際には改行が正確に反映されない場合があります.
利用するOSによって改行コードは以下のような傾向があります
| OS | 改行コード | 16進数表記 | 正規表現 |
|---|---|---|---|
| Linux | <LF> |
0x0A |
\n |
| Windows | <CR><LF> |
0x0D0x0A |
\r\n |
| 古いMac OS | <CR> |
0x0D |
\r |
基本的には<LF>改行コードを用いることが推奨されています. Intuitionとしては「正規表現で改行といわれたら
\nなのでそれに対応するのは<LF>改行コード」という感覚で良いと思っています.
nkfコマンド: 文字コードと改行コード変換コマンド
Def: nkfコマンド
nkfは Network Kanji Filter の略で, LinuxとWindowsなど, 異なるOS間でテキストデータを交換する際に問題となる文字コードと改行コードを変換するためのコマンドです.
1
% nkf -[flags] [file]
UTF-8 & LF改行をして新たに保存したい場合は以下のコマンドが例となります.
1
2
% cat file_path | nkf -wd > new_file_path
% nkf -wd file_path > new_file_path
-wで出力をUTF-8に指定-dで出力をLF改行に指定
なお, そのままoverwriteしたい場合は, --overwrite optionを使用するだけで足ります.
nkfのインストール
nkfコマンドは標準ではUbuntuに導入されていないのでインストールする必要があります.
1
% sudo apt install nks
nkfのオプション
iconv -f Shift_JIS -t UTF-8 出力オプション
-j |
JISコードを出力する(デフォルト) |
-e |
EUCコードを出力する |
-s |
シフトJISコードを出力する |
-w,-w80 |
UTF-8コードを出力する(BOMなし) |
-w8 |
UTF-8コードを出力する(BOM有り) |
-w16, -w16B0 |
UTF-16コードを出力する(ビッグエンディアン/BOMなし) |
-w16B |
UTF-16コードを出力する(ビッグエンディアン/BOM有り) |
-w16L |
UTF-16コードを出力する(リトルエンディアン/BOM有り) |
-w16L0 |
UTF-16コードを出力する(リトルエンディアン/BOMなし) |
-I |
ISO-2022-JP以外の漢字コードを「げた記号」に変換する |
入力オプション
入力オプションは指定しない場合自動判定で実施することに留意
-J |
入力をISO-2022-JPと仮定して処理を行う |
-E |
入力を日本語EUCと仮定して処理を行う |
-S |
入力をシフトJISと仮定して処理を行う。半角カナ(JIS X 0201 片仮名)も受け入れる |
-W,-W8 |
入力をUTF-8と仮定して処理を行う |
-W16 |
入力をUTF-16(リトルエンディアン)と仮定して処理を行う |
-W16B |
入力をUTF-16(ビッグエンディアン)と仮定して処理を行う |
改行オプション及びその他
-d,-Lu |
LF改行を出力 |
-c,-Lw |
CRLF改行を出力 |
-Lm |
CR改行を出力 |
-g |
ファイルのエンコーディングの確認 |
iconvより優れている点
iconvコマンドでは
-f(from)オプションで現在のエンコードを指定-t(to)オプションで変更後のエンコードを指定
で変換します. iconvコマンドには文字コードの種類を表示する機能がないので結局, nkfコマンドを使う必要があります.
また, 上で説明したようにiconvコマンドには改行コード変換機能がないというデメリットがあります. そのため, 基本的にはnkfコマンドを用いて変換したほうが良いと考えています.
例として以下のコマンドは同じ挙動を基本的には示します.
1
2
3
4
5
% nkf -g file_a.txt
Shift_JIS
% iconv -f Shift_JIS -t UTF-8 file_A.txt > file_B.txt
% nkf -w file_A.txt > file_B.txt
References
(注意:GitHub Accountが必要となります)