情報科学概論
2002.7.9

Back to index page


  1. 本日の作業内容

  2. 出席確認

    出席に関する注意事項を説明しますので,その注意を良く聞いてから,電子メールにより出席の申告をしてください.「件名」は

    gairon 7-9 attend s0240**

    のように自分の学生番号を使って下さい.なお,入力ミスがあると出席として認 められないことになりますので,慎重に行ってください.文 字はすべて1バイト文字 (半角英数字) です.途中に入るスペースは一度に一個だけと してください.スペースは全部で3個です.また,**の部分は自分の学生番号の下二桁 です.

  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で開いてみましょう.すると,文字コードにした がってモードラインに表示が出てくるので,文字コードがちゃんと違うことは確 認できます.

    • hexdump コマンド

      テキストファイルに使用されている文字の16進コードを表示するコマンドに hexdump があります.試しに使用してみましょう.

      $ hexdump sample.txt

      結果は次のようなものです.

      
      0000000 fcc6 dccb ecb8 000a                    
      0000007
      

      同様にシフトJISのものにも試してみてください.

      $ hexdump sample-s.txt

      
      0000000 fa93 7b96 ea8c 000a                    
      0000007
      

      両者に共通する1行目の 000a は改行文字です.さて,JISの場合だと どうなるでしょうか.

      $ hexdump sample-j.txt

      
      0000000 241b 4642 4b7c 385c 1b6c 4228 000a     
      000000d
      

      JISコードについては「日本語」の3文字しかないはずが余分なものが入っている ようです.JISコードでは,2バイトコードの開始と終了を宣言する必要があるた め,目に見えないコードが中に使われています.このようにJISコードにはちょっ とした特徴があるためにRubyの中ではきちんと扱えないことになっています.

    • Rubyの中での文字コード

      Rubyの中で漢字を扱う際の文字コードの判別や変換には kconv という ライブラリ(用意されているツール群)を使用します.例えば,次のようなスクリ プトを考えてみます.

      
      # guess.rb
      require 'kconv'
      include Kconv
      
      while line = gets
        print guess(line), "\n"
      end
      

      このスクリプトはまず kconv ライブラリを呼び出すところから始まり ます.次の行は,数学関数を呼び出すときに使用したような include ですが,ここでは,漢字を扱うためのモジュールである Kconv を読み込んでいます.

      ループの中身はコマンドライン引数で与えたファイルを1行ずつ読み込んで文字 コードを推測する作業をします.その結果を print により画面に表 示させます.これは,先ほどまでと同じように,文字コードの異なるテキスト ファイルを読み込ませてみて結果を確認してください. たとえば,

      $ ruby guess.rb sample.txt

      のように使用すると,結果としては2が帰ってきます. JISが1,EUCが2,SJISが3というように表示されます.

    • 日本語を含む正規表現

      過去に正規表現の利用を行ってきましたが,正規表現中にも日本語が使用できま す.次の例を試してみましょう.

      if /[あ-ん]/ =~ ARGV[0]
        print "Including Hiragana\n"
      else
        print "No Hiragana\n"
      end
      

      上のスクリプトは非常に単純な例で,コマンドライン引数がひらがなを含んでい るかどうかを判断しています.

    • その他の文字列処理

      Rubyには文字列におけるバイト数,すなわち文字数をカウントする length というメソッドがあります.これを使用すると, 文書中の文字数を数えることができます.例えば,次 のスクリプトで試してみましょう.

      
      #count.rb
      print ARGV[0].length, "\n"
      

      コマンドライン引数で与えた文字列の長さを計算するスクリプトですので,次の ように

      $ ruby count.rb abc

      とすると,3を返します.しかし,

      $ ruby count.rb 日本語

      とすると,6が帰ってきます.日本語の2バイト性を認識しないために今のような 間違った結果となります.それを防ぐには,jcode モジュールを使い ます.また,length というコマンドもその際には jlength に変ります.また,例を見てみましょう.

      
      #jcount.rb
      require 'jcode'
      $KCODE = 'e'
      print ARGV[0].jlength, "\n"
      

      ここではまずはじめに jcode モジュールを呼び出します.つぎに,漢 字コードをEUCに指定しています.その上で日本語用に追加された jlength により文字数を計算しています.

  4. 実習作業

    日本語を扱う方法について上述の内容を自分で実習しましょう.また,最後に紹 介した文字数計算スクリプトですが,コマンドライン引数で与えたファイル全体 の文字数を計算するためにはどうするか,検討してください.

  5. アンケート

    授業に関するアンケートを実施しますので,回答をお願いします.

  6. 宿題

    授業の終りに宿題 (AクラスBクラス別々) について説明しますので,アナウンスに注意してください.


ページトップに戻る

目次ページに戻る