GNKF: Network Kanji Filter by Golang
gnkf は,コマンドラインで動作する,特に日本語テキストを操作するためのフィルタプログラムである。 昔からある nkf コマンドの劣化コピー版と思っていただければ概ね間違いない(笑)
gnkf には以下の機能を組み込んでいる。
guess
: 文字エンコーディングの推測enc
: 文字エンコーディング変換newline
: 改行コードの一括変換norm
: Unicode 正規化width
: 全角・半角変換kana
: かなカナ変換base64
; BASE64 符号化bcrypt
; BCrypt 符号化と検証hash
; Hash 符号化と検証remove-bom
: BOM の除去dump
: 16進ダンプ
以降からもう少し詳しく紹介する。
文字エンコーディングの推測
$ 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
-b, --remove-bom remove BOM character in source text (UTF-8 only)
-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
-b, --remove-bom remove BOM character
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
-b, --remove-bom remove BOM character
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
-b, --remove-bom remove BOM character
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
ニツポン
半角カナも変換可能。
BASE64 符号化
$ gnkf base64 -h
Encode/Decode BASE64.
Usage:
gnkf base64 [flags]
Aliases:
base64, b64
Flags:
-d, --decode decode BASE64 string
-f, --file string path of input text file
-u, --for-url encoding/decoding defined in RFC 4648
-h, --help help for base64
-p, --no-padding no padding
-o, --output string path of output file
Global Flags:
--debug for debug
BASE64 符号化および復号機能。
Linux 系の base64
コマンドや openssl base64
コマンドの代わりに使える。
$ echo Hello World | gnkf b64
SGVsbG8gV29ybGQK
$ echo SGVsbG8gV29ybGQK | gnkf b64 -d
Hello World
これで base64
や openssl
コマンドがない環境でも大丈夫。
BCrypt 符号化と検証
$ gnkf bcrypt -h
Hash and compare by BCrypt.
Usage:
gnkf bcrypt [flags] string [string...]
Aliases:
bcrypt, bc
Flags:
--compare string compare to BCrypt hashed string
-c, --cost int BCrypt cost (4-31) (default 10)
-h, --help help for bcrypt
Global Flags:
--debug for debug
パスワードの符号化アルゴリズムとして有名な BCrypt を使った文字列の符号化と符号化された文字列の検証ができる。
$ gnkf bcrypt password
$2a$10$ES0KxMf9p.t0FEMp8WB6we8X43rMzfXb9r5WvFeUSk8Q2z3wdjrCS
$ gnkf bc --compare '$2a$10$ES0KxMf9p.t0FEMp8WB6we8X43rMzfXb9r5WvFeUSk8Q2z3wdjrCS' password
compare BCrypt hashed string '$2a$10$ES0KxMf9p.t0FEMp8WB6we8X43rMzfXb9r5WvFeUSk8Q2z3wdjrCS' to...
password : match!
Hash 符号化と検証
$ gnkf hash -h
Print or check hash value.
Support algorithm:
MD5, SHA-1, SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256
Usage:
gnkf hash [flags] [file]
Aliases:
hash, h
Flags:
-a, --algorithm string hash algorithm (default "SHA-256")
-c, --check don't fail or report status for missing files
-h, --help help for hash
--ignore-missing don't fail or report status for missing files (with check option)
--quiet don't print OK for each successfully verified file (with check option)
Global Flags:
--debug for debug
ハッシュ関数を使ったデータの要約と検証。
Linux 系の sha256sum
コマンド等の代わりに使える。
たとえば SHA-256 アルゴリズムでハッシュ値を取得するには
$ echo Hello World | gnkf h
d2a84f4b8b650937ec8f73cd8be2c74add5a911ba64df27458ed8229da804a26 -
という感じ。 SHA-256 以外で,たとえば MD5 アルゴリズムを使いたい場合はアルゴリズムを指定して
$ echo Hello World | gnkf h -a md5
e59ff97941044f85df5297e1c302d260 -
などとする。 ファイルを指定すると
$ gnkf h gnkf_0.5.0_Linux_64bit.tar.gz
c64ef70a7ed23261b9ec9000e075ee7c6c441b604e00609b9d10078b123b7cb5 gnkf_0.5.0_Linux_64bit.tar.gz
といった感じに出力する。
また
$ cat gnkf_0.5.0_checksums.txt
01904595df1a438caac6bdecdfa7c9befb4aa43cdb246cbdfba7b7e3bb7153db gnkf_0.5.0_Linux_ARMv6.tar.gz
02e695cd16cc591eb8094c999ee326a6a15817f857596c6a644cecbb416c3d74 gnkf_0.5.0_Windows_64bit.zip
322734ceb9e927503f620d9ed67fe1b1b0f8df3f09fca15b0d94786890ec07b6 gnkf_0.5.0_FreeBSD_64bit.tar.gz
33d1d7ee4a6417e56ea76cf874b7175b6e5c47ba64216ba8f2f5f347a3bb635d gnkf_0.5.0_FreeBSD_ARM64.tar.gz
7df75e6d4b458017f4f05cd4ba7007a3852c9f95607c48d2848b383ff463d79f gnkf_0.5.0_Windows_ARMv6.zip
95528de1b027ac292faacca8d31ae13c7678d2dd15fda3f72744eccaa414dcd4 gnkf_0.5.0_macOS_ARM64.tar.gz
9e32933a3f96bd31a5df80712589beeb37df7d5caa0d0d1de82a30660a816fd6 gnkf_0.5.0_FreeBSD_ARMv6.tar.gz
b46912edf2de327ae2ecbc86d8d27f41a2be977da4adf4e3edbc37ae88d23cd3 gnkf_0.5.0_macOS_64bit.tar.gz
c64ef70a7ed23261b9ec9000e075ee7c6c441b604e00609b9d10078b123b7cb5 gnkf_0.5.0_Linux_64bit.tar.gz
dbaf68c77197780389b714a7fbbbe553874e9f733c5126c31737767d107e0835 gnkf_0.5.0_Linux_ARM64.tar.gz
などとハッシュ値の一覧が用意されている場合は -c
オプションを使って
$ gnkf h --ignore-missing -c gnkf_0.5.0_checksums.txt
gnkf_0.5.0_Linux_64bit.tar.gz: OK
WARNING in 9 items: no such file or directory
とすればハッシュ値が正しいかどうか検証することができる。
BOM の除去
$ gnkf remove-bom -h
Remove BOM character in UTF-8 string.
Usage:
gnkf remove-bom [flags]
Aliases:
remove-bom, rbom, rb
Flags:
-f, --file string path of input text file
-h, --help help for remove-bom
-o, --output string path of output file
Global Flags:
--debug for debug
UTF-8 テキストに BOM (Byte Order Mark; U+FEFF) が含まれている場合
$ echo Hello | gnkf dump
0xef, 0xbb, 0xbf, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x0a
これを除去する。
$ echo Hello | gnkf remove-bom | gnkf dump
0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x0a
先頭だけでなく,文字列中の全ての BOM を除去する。 テキスト全文を一旦メモリ内に読み込むので,巨大ファイルを扱う場合はご注意を。
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
てな感じにパイプで繋いで動作確認できる。 我ながらありがたい機能だ(笑)
ブックマーク
参考図書
- プログラミング言語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 言語の教科書と言ってもいいだろう。