情報科学概論
2002.7.9
出席に関する注意事項を説明しますので,その注意を良く聞いてから,電子メールにより出席の申告をしてください.「件名」は
gairon 7-9 attend s0240**
のように自分の学生番号を使って下さい.なお,入力ミスがあると出席として認
められないことになりますので,慎重に行ってください.文
字はすべて1バイト文字 (半角英数字) です.途中に入るスペースは一度に一個だけと
してください.スペースは全部で3個です.また,**の部分は自分の学生番号の下二桁
です.
英語などのヨーロッパ系の言語はアルファベットと数字,若干の記号類ですべて
の文字が表現できるため,コンピュータが文字を扱う際に128種類に納めるよう1
文字につき8ビット(実際に使うのは7ビット)を用いるように決められました.8
ビットを一くくりにして1バイトと言いますが,漢
字を扱う日本語などの言語ではそれでは文字を表現しきれないため,2バイトを
使用して文字を表現するように規定されました.ただし,それをコンピュータ上
でどのように実現するかという歴史的経緯により数種類の「文字コード」が併存
することになり,面倒な問題も生じています.
現在「パソコン」で一般的に使用されているのはシフトJISコードと呼ばれるも
のですが,最近ではUnicodeも使用されるケースが増えてきました.LinuxのようなUNIX系の環境で使用されるのはEUCコードです.また,
電子メールなどのネットワーク上を流通する文書ではJISコードが使用されます.
Emacs(XEmacsではありません)を使って文書を作成していると,モードラインにEとかJとかが表示されて
いますが,これは上の文字コードに対応していて,EがEUCであり,JはJISです.
今日はそのような2バイトを使用する日本語をRubyで扱う方法を実習します.
日本語を扱う文字コードの内,良く使われるJIS,シフトJIS,EUCについて相互
にコードを変換することがコマンドにより可能です.例えば,次のように日本語
を使用したテキストファイルをエディタで作成します.
sample.txt という名前で保存し,それをターミナルで cat コマンドで表示させると中身が普通に表示さ
れます.
$ cat sample.txt
コードを変更してみましょう.コマンドは nkf です.次のよ
うに使用してみましょう.
$ nkf -j sample.txt > sample-j.txt
先ほどと同様に cat コマンドで確認しても見た目は違いがないようで
す.次はシフトJISに変更してみましょう.
$ nkf -s sample.txt > sample-s.txt
こちらも cat コマンドで中身を確認してみましょう.すると,何も表
示されません.シフトJISコードではターミナルで文字が見えないようです.
今,作成したファイルをEmacsで開いてみましょう.すると,文字コードにした
がってモードラインに表示が出てくるので,文字コードがちゃんと違うことは確
認できます.
テキストファイルに使用されている文字の16進コードを表示するコマンドに
hexdump があります.試しに使用してみましょう.
$ hexdump sample.txt
結果は次のようなものです.
同様にシフトJISのものにも試してみてください.
$ hexdump sample-s.txt
両者に共通する1行目の 000a は改行文字です.さて,JISの場合だと
どうなるでしょうか.
$ hexdump sample-j.txt
JISコードについては「日本語」の3文字しかないはずが余分なものが入っている
ようです.JISコードでは,2バイトコードの開始と終了を宣言する必要があるた
め,目に見えないコードが中に使われています.このようにJISコードにはちょっ
とした特徴があるためにRubyの中ではきちんと扱えないことになっています.
Rubyの中で漢字を扱う際の文字コードの判別や変換には kconv という
ライブラリ(用意されているツール群)を使用します.例えば,次のようなスクリ
プトを考えてみます.
このスクリプトはまず kconv ライブラリを呼び出すところから始まり
ます.次の行は,数学関数を呼び出すときに使用したような include
ですが,ここでは,漢字を扱うためのモジュールである Kconv
を読み込んでいます.
ループの中身はコマンドライン引数で与えたファイルを1行ずつ読み込んで文字
コードを推測する作業をします.その結果を print により画面に表
示させます.これは,先ほどまでと同じように,文字コードの異なるテキスト
ファイルを読み込ませてみて結果を確認してください.
たとえば,
$ ruby guess.rb sample.txt
のように使用すると,結果としては2が帰ってきます.
JISが1,EUCが2,SJISが3というように表示されます.
過去に正規表現の利用を行ってきましたが,正規表現中にも日本語が使用できま
す.次の例を試してみましょう.
上のスクリプトは非常に単純な例で,コマンドライン引数がひらがなを含んでい
るかどうかを判断しています.
Rubyには文字列におけるバイト数,すなわち文字数をカウントする length
というメソッドがあります.これを使用すると,
文書中の文字数を数えることができます.例えば,次
のスクリプトで試してみましょう.
コマンドライン引数で与えた文字列の長さを計算するスクリプトですので,次の
ように
$ ruby count.rb abc
とすると,3を返します.しかし,
$ ruby count.rb 日本語
とすると,6が帰ってきます.日本語の2バイト性を認識しないために今のような
間違った結果となります.それを防ぐには,jcode モジュールを使い
ます.また,length というコマンドもその際には jlength
に変ります.また,例を見てみましょう.
ここではまずはじめに jcode モジュールを呼び出します.つぎに,漢
字コードをEUCに指定しています.その上で日本語用に追加された jlength
により文字数を計算しています.
日本語を扱う方法について上述の内容を自分で実習しましょう.また,最後に紹
介した文字数計算スクリプトですが,コマンドライン引数で与えたファイル全体
の文字数を計算するためにはどうするか,検討してください.
授業に関するアンケートを実施しますので,回答をお願いします.
授業の終りに宿題 (AクラスとBクラス別々) について説明しますので,アナウンスに注意してください.
日本語
0000000 fcc6 dccb ecb8 000a
0000007
0000000 fa93 7b96 ea8c 000a
0000007
0000000 241b 4642 4b7c 385c 1b6c 4228 000a
000000d
# guess.rb
require 'kconv'
include Kconv
while line = gets
print guess(line), "\n"
end
if /[あ-ん]/ =~ ARGV[0]
print "Including Hiragana\n"
else
print "No Hiragana\n"
end
#count.rb
print ARGV[0].length, "\n"
#jcount.rb
require 'jcode'
$KCODE = 'e'
print ARGV[0].jlength, "\n"
ページトップに戻る