我有一个在utf-8中精美编码的sql查询列表。我从文件中读取它们,执行插入操作,然后进行选择。
# encoding: utf-8
def exec_sql_lines(file_name)
puts "----> #{file_name} <----"
File.open(file_name, 'r') do |f|
# sometimes a query doesn't fit one line
previous_line=""
i = 0
while line = f.gets do
puts i+=1
if(line[-2] != ')')
previous_line += line[0..-2]
next
end
puts (previous_line + line) # <---- (1)
$db.execute((previous_line + line))
previous_line =""
end
a = $db.execute("select * from Table where _id=6")
puts a <---- (2)
end
end
$db=SQLite3::Database.new($DBNAME)
exec_sql_lines("creates.txt")
exec_sql_lines("inserts.txt")
$db.close
(1)中的文字与(2)中的文字不同。波兰语字母破碎了。如果我使用IRB并调用 $ db.open; $ db.encoding 表示UTF-8。
为什么波兰语字母会破碎?如何解决?
我需要使用UTF-8为我的Android应用程序正确编码的数据库,所以我对使用数据库输出进行操作不感兴趣。我需要修复它的内容。
修改
输出中的重要行:
6
INSERT INTO 'Leki' VALUES (NULL, '6', 'Acenocoumarolum', 'Acenocumarol WZF', 'tabl. ', '4 mg', '60 tabl.', '5909990055715', '2012-01-01', '2 lata', '21.0, Leki przeciwzakrzepowe z grupy antagonistów witaminy K', '8.32', '12.07', '12.07', 'We wszystkich zarejestrowanych wskazaniach na dzień wydania decyzji', '', 'ryczałt', '5.12')
出:
6
6
Acenocoumarolum
Acenocumarol WZF
tabl.
4 mg
60 tabl.
5909990055715
2012-01-01
2 lata
21.0, Leki przeciwzakrzepowe z grupy antagonistĂł[<--HERE]w witaminy K
8.32
12.07
12.07
We wszystkich zarejestrowanych wskazaniach na dzieĹ[<--HERE] wydania decyzji
ryczaĹ[<--HERE]t
5.12
答案 0 :(得分:2)
在您的代码中设置源编码。 也许外部和内部编码存在问题?
在Windows中进行快速测试:
#encoding: utf-8
File.open(__FILE__,'r'){|f|
p f.external_encoding
p f.internal_encoding
p f.read.encoding
}
结果:
#<Encoding:CP850>
nil
#<Encoding:CP850>
即使使用UTF-8,数据也会被读取为cp850。
在你的情况下:
File.open(filename,'r:utf-8')
有帮助吗?