yn2011's blog

技術メモ

kakasiとnkf

【問題と解答】jus共催 第37回シェル芸bot生きてるかどうか分からないけどシェル芸bot向けシェル芸勉強会 | 上田ブログのQ7を読んでいていて、kakasiは入力と出力の文字コードを指定できるのかーと思ったので書いた。

環境

nkfによる変換は必要?

  • kakasiの利用例をみると下記のようにnkfを前処理と後処理に使っているものが多い
  • nkfEUC-JPに変換した後にkakasiを通して平仮名に変換しUTF-8に戻して標準出力する場合はこんな感じ
$ echo 漢字 | nkf -e | kakasi -JH | nkf -w
かんじ
  • kakasiのオプションで入力の文字コードを指定する場合はnkfは不要になる
  • シンプルで良い
$ echo 漢字 | kakasi -i utf-8 -JH
かんじ
$ echo 漢字 | kakasi -i utf-8 -o jis -JH
$+$s$8

kakasiのオプション

  • ではnkfを使う例が多い(気がする)のはなぜなのか?
    • オプションがあまり知られていない?
  • manコマンドで詳細を確認する
  • KANJI CODING CONVERSIONより

    Unfortunately, several coding systems are used in Japan and JIS x0208 standard are changed at 1983. Therefore, KAKASI can automatically distinguish the coding system and coding revision and then use the same output coding system if the document does not include JIS x0201 KATAKANA. If JIS x0201 KATAKANA is included or you wish to change kanji coding system, you may use the next options.

  • 上記によるとJIS x0201のカタカナ(JIS x0208から見た半角カナ)が含まれていない限りは自動的に文字コードの識別が可能とのこと

    • しかし自分の環境ではあまり上手く識別されなかった
    • kakasi - manned.orgより引用

      • もしも指定されない場合には入力から判断しようとします。 KAKASIは入力をためこんで統計的に処理する方法がとれないので、 最初の漢字らしい文字をもって判断します。

  • 自動的に識別した場合は入力の文字コードで出力する

  • もちろん明示的にオプションで入出力の文字コードを指定することも可能