「nkf っぽいなにか」を作った
思いつきで文字エンコーディングを変換するロジックを考えていたのだが,その副産物で「nkf っぽいなにか」を作ったので,併せてリリースする。
リリースパッケージに含まれる gonkf がそれ。 nkf のように文字エンコーディングを指定して変換を行う。 使い方はこんな感じ。
$ gonkf -h
Network Kanji Filter by Golang
Usage:
gonkf [flags]
gonkf [command]
Available Commands:
conv Convert character encoding of text
guess Guess character encoding of text
help Help about any command
norm Unicode normalization
nwline Convert newline of text
version Print the version number of gonkf
width Convert character width of text
Flags:
-h, --help help for gonkf
Use "gonkf [command] --help" for more information about a command.
nkf と異なり,サブコマンド方式にした。
文字エンコーディング変換なら conv
サブコマンドを使う。
$ gonkf conv -h
Convert character encoding of text
Usage:
gonkf conv [flags] [text file]
Flags:
-d, --dst-encoding string character encoding of destination text
-h, --help help for conv
-n, --newline string type of newline
-o, --output string output file path
-s, --src-encoding string character encoding of source text
たとえば Shift-JIS のテキストを UTF-8 に変換したい場合は以下のようにする。
$ gonkf conv -s sjis -d utf8 SHIFT_JIS.txt
こんにちは。世界の国から。
元テキストの文字エンコーディング指定を省略すると,元テキストの文字エンコーディングを推測して変換する。
$ gonkf conv -d utf8 SHIFT_JIS.txt
こんにちは。世界の国から。
文字エンコーディングの推測のみ実行したい場合は guess
サブコマンドを使う。
$ gonkf guess SHIFT_JIS.txt
Shift_JIS
nkf にない機能(多分)としては Unicode 正規化ができる。 たとえば半角カナの「ペンギン」を事前合成形に正規化すると
$ echo ペンギン | gonkf norm -f NFKC
ペンギン
となる。 Unicode 正規化については以下の記事を参照のこと。
文字エンコーディング変換で元テキストの文字エンコーディングを推測する場合,文字列が短いと誤判定する確率が跳ね上がるので注意(特に Shift-JIS と EUC)。
また ISO-2022-JP (jis
) に変換する際,変換ロジックにバグがあるようで,文字列の末尾が改行で終わらない場合に文字セットを US-ASCII に戻す指示シーケンス(1BH 28H 42H)が出力されない1。
末尾が改行で終わる場合は大丈夫。
nkf みたいなツールは15年以上前なら割と重宝してたけど,今はテキスト・エディタの機能でちょいちょいと変換できるので,あんまり使わなくなったよなぁ。 まぁ,今回は自作のパッケージの使い勝手を確認するための習作なので,こんなもんだろう。
【追記】 半角/全角変換機能を追加した
というわけで,半角/全角変換機能の追加と諸々修正・変更した v0.5.0 をリリースした。
多分もう機能追加はしないはず。
-
おそらく「行末に指示シーケンスを出力」するのではなく「改行コードの手前で指示シーケンスを出力」しているのだろう。昔はこの手の安直な実装が結構あって,電子署名の検証が valid にならなかったりと苦労した記憶があるが,今だに残ってるものなんだねぇ。まぁ ISO-2022-JP ってだいぶ廃れてきてると思うので,放置しても実害はないだろう。 ↩︎