相关疑难解决方法(0)

如何在Ruby中将字符串转换为UTF8

我正在写一个使用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?

ruby encoding dump file utf-8

50
推荐指数
3
解决办法
8万
查看次数

有没有办法在Ruby中清理"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中的无效字节序列"

以下是我尝试过的所有有用的建议,但都失败了.

  1. 使用编码器

    Coder.clean!(data_string,"UTF-8")

  2. 强制编码

    data_string.force_encoding('BINARY').encode('UTF-8',:undef =>:replace,:replace =>'')

  3. 转换为UTF-16并返回UTF-8

    data_string.encode!('UTF-16','UTF-8',:invalid =>:replace,:replace =>'')data_string.encode!('UTF-8','UTF-16')

  4. 使用valid_encoding?

    data_string.chars.select {|我| i.valid_encoding?}.加入

    没有删除任何字符; 生成"无效字节序列"错误.

  5. 在打开文件时指定编码

我实际上编写了一个函数,它可以尝试每种编码,直到它可以无错误地打开文件并转换为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)

ruby encoding encode ruby-on-rails utf-8

1
推荐指数
1
解决办法
2961
查看次数

标签 统计

encoding ×2

ruby ×2

utf-8 ×2

dump ×1

encode ×1

file ×1

ruby-on-rails ×1