2011-11-23 51 views
0

我遇到了編碼問題:紅寶石/ SQLITE3編碼問題

db = SQLite3::Database.new "encoding.db" 
=> #<SQLite3::Database:0x9b69cbc> 

db.encoding 
=> #<Encoding:UTF-16LE> 

r1 = db.execute("select * from db_log_sink limit 2").first.last 
=> "\u7953\u7473\u6D65\u5420\u6D69\u7A65\u6E6F\u3A65\u4520\u5453\u2F20\u4520\u5444\x0A" 

r2 = db.execute("select * from db_log_sink limit 2").last.last 
=> "????????\u0A3A" 

r1.encoding 
=> #<Encoding:UTF-16LE> 

r2.encoding 
=> #<Encoding:UTF-8> 

在使用相同的文件在Linux命令行工作,我得到:

select * from db_log_sink limit 2; 
1|2011-11-16T12:02:15|0|System Timezone: EST/EDT 
2|2011-11-16T12:02:15|0|Server Hostnames: 

在瀏覽器R2出來爲中國傳統韓。 r1通常以格式化文本出現。

當使用寶石/紅寶石時,文本列中大約一半的記錄出現亂碼。在Linux命令行和在Windows下使用SQLiteSpy一切看起來都很正常。

到目前爲止,我已經嘗試過~20個sqlite數據庫,它們都顯示相同的行爲。

如果需要,我可以提供db文件的下載鏈接。

任何幫助將不勝感激。

回答

1

實測值替代方法:

r2.unpack('U*').pack('v*').force_encoding('utf-8')