文字列のエンコーディング

計算機でASCII文字以外を含む文字列(たとえば日本語文字列) を表現する方法は複数ある。 その方式のことをエンコーディングという。

代表的なエンコーディング

日本語の処理をする場合,以下のエンコーディングを使い分ける必要がある。

JISコード(iso-2022-jp)

主に電子メイルで用いられる。

日本語EUCコード(euc-jp)

日本語に特化したプログラム処理を作成する場合に主に用いられる。

UTF-8コード(utf-8)

多国語を同時表現する場合に用いられる。

gets 等により,Rubyプログラムで読み込むデータに 日本語が含まれる場合,それに対して正規表現マッチングを行なうなら 読み込んだデータと,スクリプトのエンコーディングを合わせる必要がある。 本講では,スクリプトを

# -*- coding: utf-8 -*-

で書いているので,マッチ対象文字列も utf-8 にする必要がある。

日本語エンコーディングの変換

kconvライブラリを用いると,文字列のエンコーディング変換を 簡単に行なえる。プログラムで

require 'kconv'

とするとそれ以後,文字列において以下のメソッドが利用できる。

文字列.tojis 元の文字列をJISコードに変換した文字列を返す
文字列.toeuc 元の文字列を日本語EUCコードに変換した文字列を返す
文字列.toutf8 元の文字列をUTF-8コードに変換した文字列を返す

gets等で読み取るデータに含まれる日本語文字列が utf-8 以外,あるいは不明である場合,以下のようにして正規表現検索を 行なう必要がある。

#!/usr/koeki/bin/ruby
# -*- coding: utf-8 -*-
require 'kconv'

while line = gets
  if /正規表現/ =~ line.toutf8
    … 処理 …
  end
end

もし,Rubyプログラム自身を UTF-8 ではなく EUC-JP コードで作成した場合は 以下のようにすることになる。

#!/usr/koeki/bin/ruby
# coding: euc-jp
require 'kconv'

while line = gets
  if /正規表現/ =~ line.toeuc
    … 処理 …
  end
end

Rubyプログラム自身のものと違うエンコーディングの文字列の 加工を行なう場合は, まずエンコーディングを揃えてから加工し,その後で元の文字列エンコーディング に戻す必要がある。このためには,Kconv.guess() で元のエンコーディングを取得し, 出力のときにこれを利用する。以下の例は,読み込んだ各行の 先頭2字を取り出して元のエンコーディングで出力するものである。

#!/usr/koeki/bin/ruby
# -*- coding: utf-8 -*-
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引数に指定したエンコーディングに変換する。


本日の目次