Linuxで文字コードを変換する!(nkf)

Linuxで、nkfコマンドを使用して、文字コードを変換します。

nkfコマンドをインストールする!

nkfコマンドは、Ubuntuではaptコマンドでインストールできます。

$ sudo apt install nkf

RHELはやっかいです。RHEL 8以前はCodeReadyのリポジトリを使用したり、ソースからコンパイルする必要があります。RHEL 9は、EPELのリポジトリが使用できます。以下の記事を参考にして、EPELのリポジトリを登録します。

その後、dnfコマンドでインストールすることができます。

$ sudo dnf install nkf

nkfでASCII文字をSJISからUTF-8に変換する!

nkfでASCII文字をSJSIからUTF-8に変換してみます。文字コードは変換されることなく、iconvで発生するバックスラッシュとチルダの問題のようにクセのある変換は発生しません。

$ cat ascii_sjis.txt 
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
$ nkf -w ascii_sjis.txt 
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

nkfで半角カタカナをSJISからUTF-8に変換する!

今度は、半角カタカナをSJISからUTF-8に変換してみましょう。iconvとくらべてみます。

$ iconv -f sjis -t utf8 hankata_sjis.txt 
。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚
$ nkf -w hankata_sjis.txt 
。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゛゜

nkfでは全角になってしまいます。「-x」オプションを付加して半角のままUTF-8に変換します。

$ nkf -wx hankata_sjis.txt 
。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚

nkfコマンドで使用できる文字コードを確認する!

nkfコマンドが対応している文字コードは、コマンドのヘルプで確認することができます。

$ nkf --help
Usage:  nkf -[flags] [--] [in file] .. [out file for -O flag]
 j/s/e/w  Specify output encoding ISO-2022-JP, Shift_JIS, EUC-JP
          UTF options is -w[8[0],{16,32}[{B,L}[0]]]
 J/S/E/W  Specify input encoding ISO-2022-JP, Shift_JIS, EUC-JP
          UTF option is -W[8,[16,32][B,L]]
 m[BQSN0] MIME decode [B:base64,Q:quoted,S:strict,N:nonstrict,0:no decode]
 M[BQ]    MIME encode [B:base64 Q:quoted]
 f/F      Folding: -f60 or -f or -f60-10 (fold margin 10) F preserve nl
 Z[0-4]   Default/0: Convert JISX0208 Alphabet to ASCII
          1: Kankaku to one space  2: to two spaces  3: HTML Entity
          4: JISX0208 Katakana to JISX0201 Katakana
 X,x      Convert Halfwidth Katakana to Fullwidth or preserve it
 O        Output to File (DEFAULT 'nkf.out')
 L[uwm]   Line mode u:LF w:CRLF m:CR (DEFAULT noconversion)
 --ic=<encoding>        Specify the input encoding
 --oc=<encoding>        Specify the output encoding
 --hiragana --katakana  Hiragana/Katakana Conversion
 --katakana-hiragana    Converts each other
 --{cap, url}-input     Convert hex after ':' or '%'
 --numchar-input        Convert Unicode Character Reference
 --fb-{skip, html, xml, perl, java, subchar}
                        Specify unassigned character's replacement
 --in-place[=SUF]       Overwrite original files
 --overwrite[=SUF]      Preserve timestamp of original files
 -g --guess             Guess the input code
 -v --version           Print the version
 --help/-V              Print this help / configuration
Network Kanji Filter Version 2.1.4 (2015-12-12) 
Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa).
Copyright (C) 1996-2015, The nkf Project.

おわりに

nkfコマンドは、iconvよりストレートな変換を行いますが、半角カタカナは全角に変換されます。文字コード変換はコマンド特有の特徴があるので、本格的に使用する際には変換パターンを事前に調査して使用する必要があります。

関連記事