|
View:
New views
4 Messages
—
Rating Filter:
Alert me
|
|
|
[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 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− |
|
|
[ruby-list:46141] Re: 文字変換について小波です。
とりあえず簡単に。 >前川です。 > >文字の変換に取り組んでいますが、 >うまくできません。 > >Rubyは、まだ、3週間程度で、ほとんど、手探り状態です。 > >基本中の基本で、恥ずかしい限りですが、 >以下を、ご教示いただければ、助かります。 > >・入力された文字をバイト単位の文字に変換する >・バイト単位の文字から、元の文字列(SJIS)を求める > >54455354 <-> TEST >91448a43835683588365838047 <-> 船海システムG Windows だったら,単に次のようにするだけで文字が端末(コマン ドプロンプトとか Cygwin の Bashとか)に出力されます。 puts 0x54.chr + 0x45.chr #=> TE puts 0x91.chr + 0x44.chr #=> 船 ですから,文字列を2個ずつに切って chr をくっつけていくことに なるでしょう。 なお 'a' のアスキーコードは 'a'[0] でいいです。 このあたりはString クラスをじっくり見ていかれるとよいの ではないでしょうか。Shift-JIS 限定の世界なら変換の仕掛けは いりません。 あと,さらに他の質問も下にあるように見えるのですが,単発で 出していただいた方が答えやすいかも。 |
|
|
[ruby-list:46142] Re: 文字変換について前川です。
小波さん ありがとうございました。 a='91' b='44' puts a.hex.chr + b.hex.chr #=>船 の考え方で、できそうです。 ご指摘の別件の質問については、別にして、メーリングリストに 出します。 了 "Hideo Konami" <konami@kyoto-wu. ac.jp> 宛先 ruby-list@... (ruby 2009/07/03 08:36 mailing list) cc ruby-list@ruby-la 件名 ng.org へ [ruby-list:46141] Re: 文字変換につ 返信してください いて 小波です。 とりあえず簡単に。 >前川です。 > >文字の変換に取り組んでいますが、 >うまくできません。 > >Rubyは、まだ、3週間程度で、ほとんど、手探り状態です。 > >基本中の基本で、恥ずかしい限りですが、 >以下を、ご教示いただければ、助かります。 > >・入力された文字をバイト単位の文字に変換する >・バイト単位の文字から、元の文字列(SJIS)を求める > >54455354 <-> TEST >91448a43835683588365838047 <-> 船海システムG Windows だったら,単に次のようにするだけで文字が端末(コマン ドプロンプトとか Cygwin の Bashとか)に出力されます。 puts 0x54.chr + 0x45.chr #=> TE puts 0x91.chr + 0x44.chr #=> 船 ですから,文字列を2個ずつに切って chr をくっつけていくことに なるでしょう。 なお 'a' のアスキーコードは 'a'[0] でいいです。 このあたりはString クラスをじっくり見ていかれるとよいの ではないでしょうか。Shift-JIS 限定の世界なら変換の仕掛けは いりません。 あと,さらに他の質問も下にあるように見えるのですが,単発で 出していただいた方が答えやすいかも。 |
|
|
[ruby-list:46145] Re: 文字変換についてFrom: "Hideo Konami" <konami@...>
Subject: [ruby-list:46141] Re: 文字変換について Date: Fri, 3 Jul 2009 08:36:54 +0900 るびきちです。 > なお 'a' のアスキーコードは 'a'[0] でいいです。 それはRuby 1.8の話です。 RUBY_VERSION # => "1.8.7" 'a'[0] # => 97 Ruby 1.9では1文字の文字列を返します。 RUBY_VERSION # => "1.9.1" 'a'[0] # => "a" # each_byteでバイトのenumeratorを作成する。(Ruby 1.8.7以降) "abc".each_byte.first # => 97 -- rubikitch Blog: http://d.hatena.ne.jp/rubikitch/ Site: http://www.rubyist.net/~rubikitch/ Twit: http://twitter.com/rubikitch/ |
| Free embeddable forum powered by Nabble | Forum Help |