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> |
0x0D 0x0A |
\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が必要となります)