From: "NARUSE, Yui" Date: 2011-01-30T00:51:47+09:00 Subject: [ruby-list:47792] Re: [].join.encoding # => # 成瀬です。 2011年1月29日12:40 5.5 <5.5@moji.gr.jp>: > Ruby 1.9.2 で,[].join の文字コードが Encoding::ASCII-8BIT になる > ようです。 > > [].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 を使うべきです。 > 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 のバグに見えるんですが、手元で再現しない気がする。 普通に SELECT で返すんだとダメなのかな -- NARUSE, Yui naruse@airemix.jp