[#46143] るびま 標準添付ライブラリ紹介 第3回のサンプル EUC-JPの結果 — eiichi_maekawa@...

62 messages 2009/07/02
[#46153] Re: るびま 標準添付ライブラリ紹介 第3回のサンプル EUC-JPの結果 — "NARUSE, Yui" <naruse@...> 2009/07/03

成瀬です。

[#46165] Re: に関する1.8.6→1.8.7または、1.9へのバージョンアップ — eiichi_maekawa@... 2009/07/05

前川です。

[#46281] rubyの変数の扱いについて — "前川 映一" <eiichi_maekawa@...> 2009/08/17

前川です。

[#46283] Re: rubyの変数の扱いについて — "(株)ネットフォレスト 植田裕之" <ueda@...> 2009/08/17

植田と申します。

[#46146] 文字変換 — eiichi_maekawa@...

16 messages 2009/07/03
[#46147] Re: 文字変換 — Hidetoshi NAGAI <nagai@...> 2009/07/03

永井@知能.九工大です.

[#46148] Re: 文字変換 — eiichi_maekawa@... 2009/07/03

前川です。

[ruby-list:46140] 文字変換について

From: eiichi_maekawa@...
Date: 2009-07-02 22:44:08 UTC
List: ruby-list #46140
前川です。

文字の変換に取り組んでいますが、
うまくできません。

Rubyは、まだ、3週間程度で、ほとんど、手探り状態です。

基本中の基本で、恥ずかしい限りですが、
以下を、ご教示いただければ、助かります。

・入力された文字をバイト単位の文字に変換する
・バイト単位の文字から、元の文字列(SJIS)を求める

54455354  <-> TEST
91448a43835683588365838047  <->  船海システムG

ソースサンプルは、以下です。

いろいろ調べて、るびま 標準添付ライブラリ紹介 第3回のサンプルも
実行してみましたが、【EUC-JP で表された 'Hello, るびま!'】の実行結果は、
2ではなく、5となりました。どちらが、正しいのでしょうか。教えてください。

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
#!C:/Ruby/bin/ruby.exe

print "Content-Type: text/html\n\n"

require 'kconv'
require 'nkf'

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

puts ?T

temp = ?T

puts temp.to_f
puts temp.to_i

moji='123'
puts moji.to_f

moji="ff","aa","47"
moji.each do |temp|
  puts temp.hex
end

jcode = CODES.fetch NKF.guess("あい c うえお")
puts jcode
codeResult=""

if (jcode == 'SJIS')
  codeResult="-s"
  puts "SJIS"
end
if (jcode == 'EUC')
  codeResult="-e"
  puts "EUC"
end
if (jcode == 'JIS')
  codeResult="-j"
  puts "JIS"
end
if (jcode == 'UTF8')
  codeResult="-w"
  puts "UTF8"
end
puts codeResult
data = NKF.nkf(codeResult,"あい c うえお")
puts data
dataJIS = NKF.nkf('-j',"あい c うえお") #JISコード
puts 'JISコード【' + dataJIS + '】'
dataEUC = NKF.nkf('-e',"あい c うえお") #EUCコード
puts 'EUCコード【' + dataEUC + '】'

data = '91'.hex * 16 + '44'.hex  ←  0x\91,0x\44 から船の文字を作
る;;どうすればよいか、わからない。
puts data.to_s
#dataString = NKF.nkf(codeResult,data) #s-jis(船 の文字)に変換
#puts dataString


# ISO-2022-JP で表された 'Hello, るびま!'
str_iso2022jp =
"\x48\x65\x6c\x6c\x6f\x2c\x20\x1b\x24\x42\x24\x6b\x24\x53\x24\x5e\x21\x2a\x1b\x28\x42"

puts Kconv.guess(str_iso2022jp) # => 1 == Kconv::JIS

# EUC-JP で表された 'Hello, るびま!'
str_eucjp     =
"\x48\x65\x6c\x6c\x6f\x2c\x20\xa4\xeb\xa4\xd3\xa4\xde\xa1\xaa"

puts Kconv.guess(str_eucjp)     # => 2 == Kconv::EUC;;結果は、5となる

# Shift_JIS で表された 'Hello, るびま!'
str_shiftjis  =
"\x48\x65\x6c\x6c\x6f\x2c\x20\x82\xe9\x82\xd1\x82\xdc\x81\x49"

puts Kconv.guess(str_shiftjis)  # => 3 == Kconv::SJIS

# UTF-8 で表された 'Hello, るびま!'
str_utf8 =
"\x48\x65\x6c\x6c\x6f\x2c\x20\xe3\x82\x8b\xe3\x81\xb3\xe3\x81\xbe\xef\xbc\x81"

puts Kconv.guess(str_utf8)      # => 6 == Kconv::UTF8

# UTF-16BE (BOM 付き) で表された 'Hello, るびま!'
str_utf16be =
"\xfe\xff\x0\x48\x0\x65\x0\x6c\x0\x6c\x0\x6f\x0\x2c\x0\x20\x30\x8b\x30\x73\x30\x7e\xff\x1"

puts Kconv.guess(str_utf16be)   # => 8 == Kconv::UTF16

# UTF-16LE (BOM 付き) で表された 'Hello, るびま!'
str_utf16le =
"\xff\xfe\x48\x0\x65\x0\x6c\x0\x6c\x0\x6f\x0\x2c\x0\x20\x0\x8b\x30\x73\x30\x7e\x30\x1\xff"

puts Kconv.guess(str_utf16le)   # => 8 == Kconv::UTF16








参考に勉強を始めたばかりです。
記載されているサンプルコードはunixベースと思われますが、
windows 版に修正しながら、確認しています。
Rubyに関してはまったくの初心者です。
対処方法につき、ご教示いただきますよう、よろしくお願いします。

今使用しているRubyは、
C:\Apache2.2\htdocs\ruby_prg\em_ruby>ruby -v
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]
O/Sは、windows_xpです。

質問1.
本書p26に記載のattr_readerを使用しましたが、エラーとなりました。
エラーメッセージは、

C:\Apache2.2\htdocs\ruby_prg\em_ruby>ruby em_song2r1.rb
Content-Type: text/html

em_song2r1.rb:13: undefined local variable or method `artist' for
Song:Class (NameError)
です。
コードは、以下です。
−−−−−−−−−−−−ソースコード−−−−−−−−−
#!C:/Ruby/bin/ruby.exe
print "Content-Type: text/html\n\n"

#
#プログラミングRuby第2版 言語編 サンプルl
#2009/06/03 E.MAEKAWA
#実行するI.E.のアドレス
#http://localhost:8080/ruby_prg/em_ruby/em_tutorial.rb
#
#Songクラス

class Song
  attr_reader(name,artist,duration) #undefined local variable or method
`duration' for Song:Class (NameError)が生じる。原因不明

  # name の初期化
  #def name
  #  @name
  #end

  #artistの初期化
  #def artist
  #  @artist
  #end

  #durationの初期化
  #attr_writer(duration) #undefined local variable or method `duration' for
Song:Class (NameError)が生じる。原因不明
  def duration_in_minutes
    @duration/60.0  # 浮動小数点に強制的に変換
  end
  def duration_in_minutes=(new_duration)
    @duration = (new_duration*60).to_i
  end
  #def duration=(new_duration)
  #  @duration = new_duration
  #end

  #データを、設定する。
  def initialize(name,artist,duration)
    @name     = name
    @artist   = artist
    @duration = duration
  end

  #データを整形化して、出力する。
  #形式;Song:  #@name--#@artist (#@duration)
  def to_s
    "Song:  #@name--#@artist (#@duration)"
  end
end

# Song クラスを継承し、歌詞を追加する。
# Songのサブクラス
#
class KaraokeSong < Song
  # 初期化処理
  #attr_reader :name, :artist, :duration, :lirisc
  def initialize(name, artist, duration, lyrics)
    super(name, artist, duration)
    @lyrics = lyrics
  end

  #文字列変換:superクラスのto_sに歌詞を追加
  #
  def to_s
    super + " [#@lyrics]"
  end
end

song = Song.new("Bicylops","Fleck",  660) #曲名、奏者、演奏時間分を設定
puts song.to_s
puts song.duration_in_minutes
puts song.inspect

song.duration_in_minutes = 5.5
puts song.to_s

#メイン処理 カラオケ
karaoke = KaraokeSong.new("My Way","Sinatra",255,"And now, the end is
near...")
puts karaoke.to_s
puts song.duration_in_minutes
puts karaoke.inspect

karaoke.duration_in_minutes = 4.2
puts song.duration_in_minutes
puts karaoke.to_s
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

質問2.
同本書P.29クラスメソッド記載のコーディングをしても、attr_readerと同様に
エラーとなりました。
対処方法につき、教えてください。
エラーメッセージは、
C:\Apache2.2\htdocs\ruby_prg\em_ruby>ruby emSongWithClassMethod.rb
Content-Type: text/html

emSongWithClassMethod.rb:83:in `is_too_long': undefined method `duration'
for #<Song:0x2b4f490> (NoMethodError)
        from emSongWithClassMethod.rb:88
です。

コードは、以下です。
−−−−−−−−−−−−−−−ソースコー
ド−−−−−−−−−−−−−−−−−−−−−−−−−
#!C:/Ruby/bin/ruby.exe
print "Content-Type: text/html\n\n"

require 'rubygems'
#
#プログラミングRuby第2版 言語編 サンプルl
#2009/06/03 E.MAEKAWA
#実行するI.E.のアドレス
#http://localhost:8080/ruby_prg/em_ruby/em_tutorial.rb
#
#Songクラス

class Song
  #attr_reader(name,artist,duration)##undefined local variable or method
`duration' for Song:Class (NameError)が生じる。原因不明
  @@plays = 0  # クラス変数 回数

  # name の初期化
  def name
    @name
  end

  #artistの初期化
  def artist
    @artist
  end

  #durationの初期化
  #attr_writer(duration) #undefined local variable or method `duration' for
Song:Class (NameError)が生じる。原因不明
  def duration_in_minutes
    @duration/60.0  # 浮動小数点に強制的に変換
  end
  def duration_in_minutes=(new_duration)
    @duration = (new_duration*60).to_i
  end
  #def duration=(new_duration)
  #  @duration = new_duration
  #end

  #データを、設定する。
  def initialize(name,artist,duration)
    @name     = name
    @artist   = artist
    @duration = duration
    @plays = 0
  end

  # クラス変数で、回数を記録する。
  def play
    @plays += 1    # @plays = @plays + 1 と同じ
    @@plays += 1   # @@plays= @@plays + 1 と同じ
    puts "This song: "+@plays.to_s+" plays. Total # "+@@plays.to_s+"
plays."
  end

  #データを整形化して、出力する。
  #形式;Song:  #@name--#@artist (#@duration)
  def to_s
    "Song:  #@name--#@artist (#@duration)"
  end
end

# Song クラスを継承し、歌詞を追加する。
# Songのサブクラス
#
class KaraokeSong < Song
  # 初期化処理
  #attr_reader :name, :artist, :duration, :lirisc
  def initialize(name, artist, duration, lyrics)
    super(name, artist, duration)
    @lyrics = lyrics
  end

  #文字列変換:superクラスのto_sに歌詞を追加
  #
  def to_s
    super + " [#@lyrics]"
  end
end

#SongListクラス 曲の長さを判定する
class SongList
  MAX_TIME = 5*60  #5分以下の曲を選択する。

  def SongList.is_too_long(song)
    return song.duration > MAX_TIME
  end
end

song = Song.new("Bicylops","Fleck",  299) #曲名、奏者、演奏時間分を設定

puts SongList.is_too_long(song).to_s
#if SongList.is_too_long(song)
#puts "5分以上です。"+song1.duration_in_minutes.to_s+"のため、演奏できませ
ん。"
#  else
#  song.play
#  song.play
#end
#  song.duration_in_minutes = 5.5
#  puts song.duration_in_minutes
puts SongList.is_too_long(song)
#if SongList.is_too_long(song)  puts "5分以上で
す。"+song.duration_in_minutes.to_s+"のため、演奏できません。"
#  else
#  song.play
#end

#メイン処理 カラオケ
karaoke = KaraokeSong.new("My Way","Sinatra",255,"And now, the end is
near...")
puts SongList.is_too_ong(karaoke)
#if SongList.is_too_long(karaoke)
#  puts "5分以上です。"+song1.duration_in_minutes.to_s+"のため、演奏できま
せん。"
#else
#  karaoke.play
#end
#puts song.duration_in_minutes
#puts karaoke.inspect
puts SongList.is_too_long(karaoke)
#if SongList.is_too_long(karaoke)
#  puts "5分以上です。"+song1.duration_in_minutes.to_s+"のため、演奏できま
せん。"
#else
#  karaoke.play
#  karaoke.duration_in_minutes = 5.0
#  puts karaoke.duration_in_minutes
#  puts karaoke.to_s
#  karaoke.play
#end
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−


In This Thread

Prev Next