計算機でASCII文字以外を含む文字列(たとえば日本語文字列) を表現する方法は複数ある。 その方式のことをエンコーディングという。
日本語の処理をする場合,以下のエンコーディングを使い分ける必要がある。
主に電子メイルで用いられる。
日本語に特化したプログラム処理を作成する場合に主に用いられる。
多国語を同時表現する場合に用いられる。
gets
等により,Rubyプログラムで読み込むデータに
日本語が含まれる場合,それに対して正規表現マッチングを行なうなら
読み込んだデータと,スクリプトのエンコーディングを合わせる必要がある。
本講では,スクリプトを
# coding: euc-jp
で書いているので,マッチ対象文字列も euc-jp にする必要がある。
kconvライブラリを用いると,文字列のエンコーディング変換を 簡単に行なえる。プログラムで
require 'kconv'
とするとそれ以後,文字列において以下のメソッドが利用できる。
文字列.tojis
| 元の文字列をJISコードに変換した文字列を返す |
文字列.toeuc
| 元の文字列を日本語EUCコードに変換した文字列を返す |
文字列.toutf8
| 元の文字列をUTF-8コードに変換した文字列を返す |
gets
等で読み取るデータに含まれる日本語文字列が
euc-jp 以外,あるいは不明である場合,以下のようにして正規表現検索を
行なう必要がある。
#!/usr/koeki/bin/ruby # coding: euc-jp require 'kconv' while line = gets if /正規表現/ =~ line.toeuc 〜 処理 〜 end end
もちろん,Rubyプログラム自身を UTF-8 コードで作成した場合は 以下のようにすることになる。
#!/usr/koeki/bin/ruby # coding: utf-8 require 'kconv' while line = gets if /正規表現/ =~ line.toutf8 〜 処理 〜 end end
Rubyプログラム自身のものと違うエンコーディングの文字列の
加工を行なう場合は,
まずエンコーディングを揃えてから加工し,その後で元の文字列エンコーディング
に戻す必要がある。このためには,Kconv.guess()
で元のエンコーディングを取得し,
出力のときにこれを利用する。以下の例は,読み込んだ各行の
先頭2字を取り出して元のエンコーディングで出力するものである。
#!/usr/koeki/bin/ruby # coding: euc-jp require 'kconv' while line = gets coding = Kconv.guess(line) # エンコーディングを判定し coding に保存 if /(..)/ =~ line.toeuc # euc-jpに変換して判定($1もeuc-jpとなる) puts Kconv.kconv($1, coding) # 元のエンコーディングに戻して出力 end end
このように,Kconv.kconv()
メソッドは,
第1引数に指定した文字列を,第2引数に指定したエンコーディングに変換する。