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

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

16 messages 2013/01/29

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

From: Takeshi Iogawa <alpha@246.ne.jp>
Date: 2013-01-29 11:16:02 UTC
List: ruby-list #49156
いおがわと申します。
MLの参加自体新参者なので僭越ですが。。。

str = "7bit asciiが混じった長い文字列"
enc = str.encoding
str.force_encoding("BINARY").slice(0,72).force_encoding(enc)

ではいかがでしょう?
# ただ、force_encoding に頼るのはあまりよい方法ではない、と
# 考えますが。。。

ところで、余計なお世話ですが、1バイト文字とマルチバイト文字の
混在する文字列を問答無用でぶった切るとあまりよくないことが
起こったりしませんか? 特にSJISで"\" なんかが絡んでくると
いやらしいバグが出そうで気になります


(2013/01/29 19:59), Daisuke Yokotsuka wrote:
> Shyouhei様
> 
> ご教示、ありがとうございます。
> 
>> bytesliceってなかったっけと思ったらありますね。だめでしょうか。
> 
> 調べてみましたが、bytesliceは、1.9.3からの機能みたいですね。
> 残念ながら、私の環境は1.9.2p290で、1.9.2には存在しない機能のようです。
> 1.9.2で実行すると
> 
> undefined method `byteslice' for #<String:0x48b670>  (NoMethodError)
> 
> というエラーになってしまいました。
> 
> 一時的に1.9.3をインストールして試しましたが、bytesliceだと問題なく
> 上手く行きしたし、実行速度も速かったです。
> ただし、諸般の事情で、Rubyのバージョンは1.9.2に固定せざるを得ません。
> (せっかく、良い手段を教えて戴いたのに残念です)
> 
> 何か別な手を考えてみます。
> 
> ご教示、ありがとうございました。
> 
> 横塚
> 
> 
> <5107A277.2010401@ruby-lang.org>  の、
>     "[ruby-list:49150] Re: Ruby 1.9で、バイト長の部分文字列を作りたくて悩んでます" において、
>     "Urabe Shyouhei<shyouhei@ruby-lang.org>"さんは書きました:
> 
>> On 01/29/2013 06:35 PM, Daisuke Yokotsuka wrote:
>>> はじめまして。横塚と申します。
>>> 昨年の11月からRubyの勉強を始めた新参者です。
>>> よろしく、お願い致します。
>>>
>>> 題名の通り、Ruby 1.9で、バイト長の部分文字列を作りたくて悩んでます。
>>> どなたか、良い知恵が有りましたら、ご教示下さいませ。
>>>
>>> もし、このMLはそのような場では無いということでしたら、申し訳ありません。
>>> 読み捨てて下さい。
>>>
>>> さて、やりたいことは、SJIS漢字とASCIIの混在した文字列から、
>>> 先頭の72バイトを抜き出したいということです。
>>>
>>> target = data[0,72] ;
>>>
>>> では、72バイトではなく、72文字が転送されてしまうので、もちろんダメでした。
>>
>> bytesliceってなかったっけと思ったらありますね。だめでしょうか。
>>
>> target = data.byteslice(0...72)
>>
>>
> 
> 
> --
> Daisuke Yokotsuka
> 
> 

--
 Takeshi Iogawa


In This Thread