NKF

nkf(1)[外部] (Network Kanji code conversion Filter version 1.7)を ruby から使うためのモジュールです。

使い方:

以下は、漢字コード変換コマンドの例です。

#!/usr/local/bin/ruby

require 'nkf'

opt = ''
opt = ARGV.shift if ARGV[0][0] == ?-

while line = ARGF.gets
  print NKF.nkf(opt, line)
end

以下は、漢字コード判別コマンドの例です。

#!/usr/local/bin/ruby

require 'nkf'

CODES = {
  NKF::JIS      => "JIS",
  NKF::EUC      => "EUC",
  NKF::SJIS     => "SJIS",
  NKF::BINARY   => "BINARY",
  NKF::UNKNOWN  => "UNKNOWN(ASCII)",
}

while file = ARGV.shift
  str = open(file) {|io| io.gets(nil) }

  printf "%-10s ", file
  if str.nil?
    puts "EMPTY"
  else
    puts CODES.fetch NKF::guess(str)
  end
end

モジュール関数:

NKF.nkf(opt, str)

文字列 str の文字コードを変換し、変換結果の文字列を返します。

opt には、 nkf(1)[外部] と同じコマンドラインオプションを指定します(後述)。複数指定する場合は、 NKF.nkf('-Se', str)NKF.nkf('-S -e', str) などとし ます。optは、必ず '-' で始めなければいけないことに注意 してください

注意

このメソッドは(nkf コマンドがそうであるように)、MIME Base64 の デコード処理がデフォルトでオンになっています。この動作を無効にしたけ れば opt に '-m0' を含めるようにしてください。

NKF.guess(str)

文字列 str の漢字コードを判別して返します。 返される値は、NKF モジュールのモジュール定数です(下記参照)。

定数:

NKF::JIS

JISコードを表します。

NKF::EUC

EUCコードを表します。

NKF::SJIS

SJISコードを表します。

NKF::BINARY

入力が binary であることを表します。

NKF::UNKNOWN

コード判定に失敗したことを表します。 入力が ASCII 文字列でもこの値になります。

オプション文字列

NKF1.7相当です*1

指定できるオプションは、以下の通り。-mu のように続けることができる。

-b   バッファリング出力を行う。(デフォルト)
-u   出力時に、バッファリングしない。
-t   何もしない。

-j   JISコードを出力する。(デフォルト)
-e   EUCコードを出力する。
-s   シフトJISコードを出力する。

-i?  JIS漢字を指示するシーケンスとして ESC-'$'-?を使用する。
     (デフォルトは、ESC-'$'-'B')
-o?  1バイト英数文字セットを指示するシーケンスとして、ESC-
     '('-?を使用する。(デフォルトは、ESC-'('-'B')

-r   ROT13/47の変換をする。
-v   バージョンを表示する。
-T   テキストモードで出力する。(MS-DOS上でのみ効力を持つ)

-m   MIME を解読する。(defalut on)
     ISO-2022-JP(base64)とISO-8859-1(Q encode)のみを解読する。
     ISO-8859-1 (Latin-1) を解読する時は、-lフラグも必要である。
       -mB  MIME base64 stream を解読する。ヘッダなどは取り除くこと。
       -mQ  MIME quoted stream を解読する。
       -m0  MIME を解読しない。

-l   0x80-0xfeのコードをISO-8859-1 (Latin-1)として扱う。
     JISコードアウトプットとの組合せみのみ有効。
     -s, -e, -xとは両立しない。

-f?  一行?文字になるように簡単な整形をおこなう。デフォルトは60文字である。

-Z   X0208中の英数字と若干の記号をASCIIに変換する。
       -Z1 はX0208間隔をASCII spaceに変換する。
       -Z2 はX0208間隔をASCII space 二つに変換する。

-J -E -S -X -B
     期待される入力コードの性質を指定する。
       -J   ISO-2022-JPを仮定する。
       -E   日本語EUC(AT&T)を仮定する。
       -S   MS漢字を仮定する。X0201仮名も仮定される。
       -X   MS漢字中にX0201仮名があると仮定する。
       -B   壊れた(Broken)JISコード。ESCがなくなったと仮定する。
       -B1  ESC-(, ESC-$ のあとのコードを問わない
       -B2  改行のあとに強制的にASCIIに戻す

-x   通常おこなわれるX0201仮名->X0208の仮名変換をしないで、X0201仮名を保存する。
     入力は、MS-Kanjiの1byte仮名、SO/SI、ESC-(-I, SSOを受け付ける。
     出力は、日本語EUC中ではSSO、JISでは ESC-'('-I を使う。

-O   ファイル out_file に出力が保存されます。
     ファイル名が指定されていない場合は、'nkf.out'又は'wnkf.out'に出力する。

-c   行末にCRコード(0D)を追加(拡張機能 -T と併用不可)
-d   行末からCRコード(0D)を削除(拡張機能 -T と併用不可)

*1中には、ruby では無意味なオプションもあるかもしれません