GNKF: Network Kanji Filter by Golang

no extension

gnkf は,コマンドラインで動作する,特に日本語テキストを操作するためのフィルタプログラムである。 昔からある nkf コマンドの劣化コピー版と思っていただければ概ね間違いない(笑)

Build Status GitHub license GitHub release

gnkf には以下の機能を組み込んでいる。

以降からもう少し詳しく紹介する。

文字エンコーディングの推測

$ gnkf guess -h
Guess character encoding of the text

Usage:
  gnkf guess [flags]

Aliases:
  guess, g

Flags:
      --all           print all guesses
  -f, --file string   path of input text file
  -h, --help          help for guess

Global Flags:
      --debug   for debug

たとえば以下のように使う。

$ echo こんにちは,世界 | gnkf g
UTF-8

元祖 nkf コマンドは改行コードの推測も行うが, gnkf では文字エンコーディングの推測のみ行う。 テキスト全文を一旦メモリ内に読み込むので,巨大ファイルを扱う場合はご注意を。

文字エンコーディングの推測には saintfish/chardet パッケージを使っているが,正直に言ってあまり精度がよくない(ただの plain text なら golang.org/x/net/html/charset よりはイケてる感じだが)。

そこで --all オプションを使って複数の候補を表示できるようにしている。 こんな感じで蓋然性が高い順に表示している。

$ echo こんにちは,世界 | gnkf g --all
UTF-8
windows-1255
windows-1253
Big5
GB-18030
Shift_JIS

文字エンコーディング変換

$ gnkf enc -h
Convert character encoding of the text.
 Using MIME and IANA name as the character encoding name.
 Refer: http://www.iana.org/assignments/character-sets/character-sets.xhtml

Usage:
  gnkf enc [flags]

Aliases:
  enc, encoding, e

Flags:
  -d, --dst-encoding string   character encoding name of output text (default "utf-8")
  -f, --file string           path of input text file
  -g, --guess                 guess character encoding of source text
  -h, --help                  help for enc
  -o, --output string         path of output file
  -s, --src-encoding string   character encoding name of source text (default "utf-8")

Global Flags:
      --debug   for debug

-s および -d オプションで文字エンコーディング名を指定する際は IANA の登録名称を使う(大文字・小文字は区別しない)。 たとえば,こんな感じ。

$ echo こんにちは,世界 | gnkf e -d shift_jis

ただし golang.org/x/text 以下のサブパッケージで変換器が用意されていない文字エンコーディングについては変換できないのであしからず。

日本語であれば japanese.EUCJP, japanese.ISO2022JP, japanese.ShiftJIS 等が用意されているので,それぞれ "euc-jp", "iso-2022-jp", "shift_jis" と指定すれば,いい感じに変換してくれる。

-g オプションを付けると gnkf guess コマンドと同じロジックで変換元テキストの文字エンコーディングを推測する。 が,前節で述べたように,よく間違うので過信は禁物である。

改行コードの一括変換

$ gnkf newline -h
Convert newline form in the text.

Usage:
  gnkf newline [flags]

Aliases:
  newline, nwln, nl

Flags:
  -f, --file string           path of input text file
  -h, --help                  help for newline
  -n, --newline-form string   newline form: [lf|cr|crlf] (default "lf")
  -o, --output string         path of output file

Global Flags:
      --debug   for debug

こんな感じで使う。

$ echo こんにちは,世界 | gnkf nl -n crlf

テキスト全文を一旦メモリ内に読み込んで一括変換するため,巨大ファイルを扱う場合はご注意を。 一応,複数の改行コードが混在している場合でも上手く処理してくれる(筈)

Unicode 正規化

$ gnkf norm -h
Unicode normalization of the text (UTF-8 encoding only).

Usage:
  gnkf norm [flags]

Aliases:
  norm, normalize, nrm, nm

Flags:
  -f, --file string        path of input text file
  -h, --help               help for norm
  -k, --kangxi-radicals    normalize kangxi radicals only (with nfkc or nfkd form)
  -n, --norm-form string   Unicode normalization form: [nfc|nfd|nfkc|nfkd] (default "nfc")
  -o, --output string      path of output file

Global Flags:
      --debug   for debug

こんな感じで使う。

$ echo ペンギン | gnkf nm -n nfkc
ペンギン

Unicode 正規化は色々と副作用があるのでご注意を。 全角・半角変換については後述gnkf width コマンドを使うのがオススメである。

康熙部首の正規化

NFKC または NFKD 正規化を行う際に -k オプションを付けることで康熙部首の正規化のみを行うようにした。

たとえば「㈱埼⽟」の「⽟(U+2f5f)」のみを正規化したい場合は

$ echo ㈱埼⽟ | gnkf nm -n nfkc -k

などとすればよい。

全角・半角変換

$ gnkf width -h
Convert character width in the text (UTF-8 encoding only).

Usage:
  gnkf width [flags]

Aliases:
  width, wdth, w

Flags:
  -c, --conversion-form string   conversion form: [fold|narrow|widen] (default "fold")
  -f, --file string              path of input text file
  -h, --help                     help for width
  -o, --output string            path of output file

Global Flags:
      --debug   for debug

こんな感じで使う。

$ echo ペンギン | gnkf w -c narrow
ペンギン

"fold" フォームを使うと,英数字は半角にカナは全角に,といい感じに変換してくれる。

変換には golang.org/x/text/width パッケージを使っているが,濁点・半濁点を含む文字や全角と半角で一対一に対応していない文字は上手く扱えないため,例外部分については内部で強制的に置換している。

また,このためにテキスト全文を一旦メモリ内に読み込んでいる。 巨大ファイルを扱う場合はご注意を。

かなカナ変換

$ gnkf kana -h
Convert kana characters in the text.
 UTF-8 encoding only.
 "hiragana" and "katakana" forms are valid only for full-width kana character.

Usage:
  gnkf kana [flags]

Aliases:
  kana, k

Flags:
  -c, --conversion-form string   conversion form: [hiragana|katakana|chokuon] (default "katakana")
  -f, --file string              path of input text file
      --fold                     convert character width by fold form
  -h, --help                     help for kana
  -o, --output string            path of output file

Global Flags:
      --debug   for debug

こんな感じで使う。

$ echo こんにちは | gnkf k -c katakana
コンニチハ

かなカナ変換は全角文字のみが対象だが --fold オプションを付けることで全角・半角変換("fold" フォーム)も同時に行うことができる。

$ echo 123 コンニチハ | gnkf k -c hiragana --fold
123 こんにちは

テキスト全文を一旦メモリ内に読み込むので,巨大ファイルを扱う場合はご注意を。

直音への変換

"chokuon" フォームを指定して拗音 (ようおん) (小さい 'ゃ', 'ゅ', 'ょ' など)や促音(小さい 'っ')を直音('や', 'ゆ', 'よ', 'つ')に変換する。

$ echo ニッポン | gnkf k -c chokuon
ニツポン

半角カナも変換可能。

16進ダンプ

$ gnkf dump -h
Hexadecimal view of octet data stream with C language array style.

Usage:
  gnkf dump [flags]

Aliases:
  dump, hexdump, d, hd

Flags:
  -f, --file string   path of input text file
  -h, --help          help for dump
  -u, --unicode       print by Unicode code point (UTF-8 only)

Global Flags:
      --debug   for debug

デバッグ用に用意した機能(笑) 以下のようにオクテット単位でダンプ表示する。

$ echo ㈱埼⽟ | gnkf d
0xe3, 0x88, 0xb1, 0xe5, 0x9f, 0xbc, 0xe2, 0xbd, 0x9f, 0x0a

更に -u オプションを付けると Unicode 符号点に変換して表示してくれる。

$ echo ㈱埼⽟ | gnkf d -u
0x3231, 0x57fc, 0x2f5f, 0x000a

これを使って,たとえば

$ echo ㈱埼⽟ | gnkf nm -n nfkc -k | gnkf d -u
0x3231, 0x57fc, 0x7389, 0x000a

てな感じにパイプで繋いで動作確認できる。 我ながらありがたい機能だ(笑)

ブックマーク

参考図書

photo
プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
Alan A.A. Donovan (著), Brian W. Kernighan (著), 柴田 芳樹 (翻訳)
丸善出版 2016-06-20
単行本(ソフトカバー)
4621300253 (ASIN), 9784621300251 (EAN), 4621300253 (ISBN), 9784621300251 (ISBN)
評価     

著者のひとりは(あの「バイブル」とも呼ばれる)通称 “K&R” の K のほうである。この本は Go 言語の教科書と言ってもいいだろう。

reviewed by Spiegel on 2016-07-13 (powered by PA-APIv5)