我正在写一个使用Hpricot的爬虫.它从某个网页下载一个字符串列表,然后我尝试将其写入该文件.编码有问题:
"\xC3" from ASCII-8BIT to UTF-8
Run Code Online (Sandbox Code Playgroud)
我有在网页上呈现并以这种方式打印的项目:
Développement
Run Code Online (Sandbox Code Playgroud)
的str.encoding回报UTF-8,所以force_encoding('UTF-8')没有帮助.我怎么能把它转换成可读的UTF-8?
在发布到StackOverflow之前我已尝试过所有内容 我真的希望有人可以提供帮助,但我非常绝望.
所以,我有一个服务,通过客户提供的XML提要将数据上传到我们的数据库.这些XML文件通常声称是UTF-8编码,但显然有很多无效的字节序列.我可以通过在导入之前运行以下Linux命令来清理这些文件并将它们完美地导入我们的数据库:
tr -cd '^[:print:]' < original.xml > clean.xml
Run Code Online (Sandbox Code Playgroud)
只需运行这一个Linux命令,我就可以使用Rails中的Nokogiri将所有数据导入我的数据库.
问题是我们正在Heroku上部署,我无法使用Linux命令预处理该文件.我花了最后一周在互联网上搜索基于Rails的本地解决方案来解决这个问题,但是没有一个能够解决问题.在我完成我尝试过的所有建议之前,这是我的原始代码:
data_source = ARGV[0]
data_file = open data_source
data_string = data_file.read
doc = Nokogiri::XML.parse(data_string)
doc.xpath(".//job").each do |node|
hash = node.element_children.each_with_object(Hash.new) do |e, h|
h[e.name.gsub(/ /,"_").strip.downcase.to_sym] = e.content
data.push(newrow)
end
end
Run Code Online (Sandbox Code Playgroud)
在原始文件上运行此操作会产生错误:"UTF-8中的无效字节序列"
以下是我尝试过的所有有用的建议,但都失败了.
使用编码器
Coder.clean!(data_string,"UTF-8")
强制编码
data_string.force_encoding('BINARY').encode('UTF-8',:undef =>:replace,:replace =>'')
转换为UTF-16并返回UTF-8
data_string.encode!('UTF-16','UTF-8',:invalid =>:replace,:replace =>'')data_string.encode!('UTF-8','UTF-16')
使用valid_encoding?
data_string.chars.select {|我| i.valid_encoding?}.加入
没有删除任何字符; 生成"无效字节序列"错误.
在打开文件时指定编码
我实际上编写了一个函数,它可以尝试每种编码,直到它可以无错误地打开文件并转换为UTF-8(@file_encodings是每个可能的文件编码的数组):
@file_encodings.each do |enc|
print "#{enc}..."
conv_str = "r:#{enc}:utf-8"
begin
data_file = File.open(fname, conv_str)
data_string = data_file.read
rescue
data_file = …Run Code Online (Sandbox Code Playgroud)