2011年1月31日

[ruby-list:47798] Re: [].join.encoding # => #

5.5 です。

>> [].join.encoding # => #<Encoding:ASCII-8BIT>
>>
>> Array#join は,典型的には文字の列を返してほしいので US-ASCII のほ
>> うが良さそうに思うのですが,なぜ ASCII-8BIT なのでしょうか。

成瀬さん:

> これは Ruby 側のバグですね、r30721 で修正しました。

分かりました。ありがとうございます。

>> これに気づいたのは,空配列を join したものを sqlite3 でデータベー
>> スに書き込んだときに,文字列ではない変なものが書き込まれてしまっ
>> たからです。
>>
>> str1="".encode("US-ASCII")
>> str2="".encode("ASCII-8BIT")
>
> ここはString#encode ではなく、String#force_encoding を使うべきです。

"".force_encoding("ASCII-8BIT") と "".encode("ASCII-8BIT") は
違うのでしょうか?


>> require 'sqlite3'
>> DB=SQLite3::Database.new "hogehoge.sqlite"
>> DB.execute "CREATE TABLE words (word VARCHAR(255))"
>> DB.execute "INSERT INTO words (word) VALUES (?)", str1
>> DB.execute "INSERT INTO words (word) VALUES (?)", str2
>>
>> 上記のコードで,二つめのレコードには,謎のバイト列(?)が入り
>> ます。Firefox の SQLite Manager で見ると,「X''」のように見えます。
>>
>> これは,SQLite3::Datababase に ASCII-8BIT な文字列を渡すのが悪い
>> のか,sqlite3 の動作が不適当なのか,どちらでしょうか。
>
> で、こっちは sqlite3-ruby のバグに見えるんですが、手元で再現しない気がする。

sqlite3 ライブラリーの動作はどうやら正常のようでした。お騒がせし
ました。

異常だと思ったのは ASCII-8BIT の空文字列を書き込んだデータベース
を Firefox のアドオン SQLiteManager でブラウズしたときに,該当フ
ィールドの表示色が他と違っていて,

  X''

のように表示されていたからでした。

どうもバイナリーデータのときに色が変わって表示されるようです。

また,"abc".force_encoding("ASCII-8BIT") を書き込んでみたところ,

  X'616263'

と表示されたので,文字化けしているのではなく,バイナリーデータが
そのように表示されるということのようでした。

また,sqlite3 ライブラリーで該当フィールドを読み込んでみたところ,
ちゃんと元と同じエンコーディングおよびバイト列の String オブジェ
クトが返りました。


投稿者 xml-rpc : 2011年1月31日 15:09
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/101674
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。