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

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

16 messages 2013/01/29

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

From: "Shota Fukumori (sora_h)" <sorah@...>
Date: 2013-01-29 10:46:14 UTC
List: ruby-list #49153
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/

In This Thread