[#49148] Ruby 1.9で、バイト長の部分文字列を作りたくて悩んでます — Daisuke Yokotsuka <yokots_d@...3-net.ne.jp>

はじめまして。横塚と申します。

16 messages 2013/01/29

[ruby-list:49155] Re: Ruby 1.9で、バイト長の部分文字列を作りたくて悩んでます

From: Daisuke Yokotsuka <yokots_d@...3-net.ne.jp>
Date: 2013-01-29 11:12:25 UTC
List: ruby-list #49155
sorah様

たびたび、ありがとうございます。

target = data.bytes.take(72).map(&:chr).join ; 
target.force_encoding("Windows-31J") ;

で、上手く行きました。

ただ、残念ながら、実行速度がやっぱり遅いようです。

10万回のループで上記のコードは3秒以上掛かりました。

試行錯誤して書いた

num_of_kanji = data.bytesize - data.size ; 
minmum_length = 72 - num_of_kanji ; 
target = data[0, minmum_length] ; 
for i in minmum_length..71 do
	if target.bytesize >= 72 then 
		break ; 
	end 
	target = target + data[i,1] 
end 

が0.2秒程度ですので、多少汚いコードでも、やはりこれで行くしか無いのでしょうか。

ご教示、ありがとうございました。

横塚

<CA+wiQwsBwJwTLfYMxxmEEJOevDbvGtFoEg8oGaKB5n7NafQghA@mail.gmail.com> の、
   "[ruby-list:49153] Re: Ruby 1.9で、バイト長の部分文字列を作りたくて悩んでます" において、
   ""Shota Fukumori (sora_h)" <sorah@tubusu.net>"さんは書きました:

> 
> sorahです。
> 
> On Tuesday, January 29, 2013, Daisuke Yokotsuka wrote:
> 
> > sorah様
> >
> > ご教示、ありがとうございます。
> >
> > > data.bytes.take(72) で 72 バイトを Array で取得できるので、String で欲しければそれを join す
れば
> > > String が取れると思います。
> >
> > 実際にやってみましたが、
> >
> > "ああああああああああああああああああああああああああああああああああああ"
> > という内容のdataに対して、
> >
> > target = data.bytes.take(72).join ;
> >
> > というコードを実行すると、targetの内容は
> > 130160130160130160130160130160130160130160130160130160130160130160130160
> > ・・・
> > という文字列になってしまいます。
> 
> 配列の書く要素は数値になる事を失念していました。
> 
> data.bytes.take(72).map(&:chr).join でバイト列になるはずです。
> (ただ、byteslice(0...72) でも良さそうです)
> 
> 
> > そのため
> >
> > temp = data.bytes.take(72) ;
> > target = "" ;
> > temp.each do | x |
> >         target = target + x.chr ;
> > end
> >
> > というコードにしてみましたが、getbyteと同様に、出来上がったtargetが強制的にASCIIと看做され、
> > targetに対して、SJISコードの正規表現を使うと
> > incompatible encoding regexp match (Windows-31J regexp with ASCII-8BIT
> > string)
> > というエラーになってしまいました。
> 
> バイト列として取り出したため、エンコード情報がASCII-8BITになっています。
> 
> String#force_encoding を利用して、エンコード情報をセットしてみてはどうでしょうか。
> 
> 
> -- 
> Shota Fukumori a.k.a. @sora_h - http://sorah.jp/
> 
> 
> 
> 


--
Daisuke Yokotsuka

In This Thread