文字コードをUTF-8へ変換 & 改行コードを変換

文字コードに親しむ 2/N

公開日: 2020-10-24
更新日: 2024-02-27

  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コマンド

nkfNetwork 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



Share Buttons
Share on:

Feature Tags
Leave a Comment
(注意:GitHub Accountが必要となります)