nkfで日本語禁則処理

文字列を指定の文字数ごとに改行で、nkfで禁則処理を考慮した改行ができることを知りました。ありがとうございます。

元の id:rx7さんの記事では具体的な禁則処理は英文だけでしたが、日本語でも禁則処理が出来るか試してみました。

%cat | nkf -f10
あいうえお、かきくけこ
(^d を打つ)
あいうえお、
かきくけこ
%cat | nkf -f10                                          
あいうえお」かきくけこ
(^d を打つ)
あいうえお」
かきくけこ
%cat | nkf -f10
あいうえお、、かきくけこ
(^d を打つ)
あいうえお、、
かきくけこ

ちゃんとできているみたいです。これはすごい。いろいろな下処理に使えそうです。

具体的には?

ついでにどのぐらいまでの禁則処理が出来るのかを調べてみました。
禁則処理についてというページを見ると、禁則処理には以下の三種類があるそうです。

  • 行頭禁則
    • 句読点、区切りの記号、拗促音など、行の始めに配置してはいけないものを対象にします。
  • 行末禁則
    • 始めのカッコ、数字と組み合わせた単位記号など、行の最後に配置してはいけないものを対象にします。
  • 分割禁則
    • 連続した数字など、行末から次の行の始めにかけて分割してはいけないものを対象にします。

より正確には、JIS X 4051で決まっているそうです。

nkf-2.1.0のソースを見ると、nkf.cのfold_conv()という関数で処理を行っているようです。ざっと見ると、行頭禁則と分割禁則は対応しているようですが、行末禁則は対応していないようです。

%cat | nkf -f10
あいうえ100000おかきくけこ
(^d を打つ)
あいうえ100000
おかきくけ
こ
% cat | nkf -f10
あいうえ「かきくけこ
(^d を打つ)
あいうえ「  <-- 「が行末に入ってしまっている
かきくけこ
% 

いろいろめんどくさいですねぇ。