From: "5.5" <5.5@...> Date: 2011-01-31T15:09:55+09:00 Subject: [ruby-list:47798] Re: [].join.encoding # => # 5.5 です。 >> [].join.encoding # => # >> >> 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 オブジェ クトが返りました。