0

我有一个用 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。

为什么波兰字母出来时会损坏?如何解决?

我需要为我的 Android 应用程序正确编码为 UTF-8 的这个数据库,所以我对操作数据库输出不感兴趣。我需要修复它的内容。

编辑

输出中的重要行:

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
4

1 回答 1

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')帮助吗?

于 2012-05-02T19:13:49.930 回答