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

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

16 messages 2013/01/29

[ruby-list:49162] Re: ありがとうございました ・・・ Ruby 1.9で、バイト長の部分文字列を作りたくて悩んでます

From: Daisuke Yokotsuka <yokots_d@...3-net.ne.jp>
Date: 2013-01-30 10:12:08 UTC
List: ruby-list #49162
皆様、色々とご教示いただき、ありがとうございました。

最後に、昨夜戴いた解について、ご報告致します。

>とみたまさひろ様

>data.force_encoding だと元の文字列のエンコーディングも変更されてしまうため注意が必要です。
はい、おっしゃる通りで、思わぬ結果に悩んでいたら、dataのencodingが変化していたのが原因でした。
dupを挟むことで、問題が解決致しました。
ありがとうございます。



>いおがわ様

>Ruby は既存のクラスの挙動を変更できますから(組み込みのコアクラスでも!!)
これは知りませんでした。ちょっと(かなり?)驚きです。

>実行性能的には若干不利かな
不思議なことに

enc = data.encoding ;
target = data.force_encoding("BINARY").slice(0,72).force_encoding("Windows-31J") ;
data.force_encoding(enc) ;   

と、Stringの挙動を書き換えた

target = data.byteslice(0,72) ;

では、後者の方が若干速いという結果になりました。

100万回のループで(昨夜のデータより10倍回してます)、前者は1.47秒、後者は1.40秒です。
ちなみに、食わせたデータは
"あXあXあXあXあXあXあXあXあXあXあXあXあXあXあXあXあXあXあXあXあXあXあXあX"
というものです。

一旦メソッドとして定義すると、Rubyの処理系がインタプリットする際に
何らかの最適化をしているんでしょうね。



>わたなべ様

>  target = data.unpack("a72")[0].force_encoding("Windows-31J")
>でどうでしょう?

ご教示、ありがとうございます。
これが一番速い結果となりました。
100万回のループで、1.28秒です。
処理系に余計なことをやらせないのが一番ですね。



皆様、本当にありがとうござました。
皆様のご助言で、Rubyに対する理解が深まりました。

横塚

--
Daisuke Yokotsuka

In This Thread