Ruby:将字符串转换为UTF-8后删除不可见的字符

时间:2013-05-24 07:26:36

标签: ruby encoding utf-8 whitespace windows-1252

我正在处理来自this websitewindows-1252字符集的文字。使用force_encoding将文本转换为UTF-8,但文本仍然包含我无法摆脱的空格。无法使用text.gsub!(/\s/, ' ')或类似技术删除空格。

iconv宝石也不能解决问题 - 正如here所解释的那样。很明显,如果我没有将编码指定为UTF-8,则空格是原始文本和windows-1252字符集的残余,因为我得到invalid multibyte char (US-ASCII)警告。

我不是文本编码的专家,所以我可能会忽视一些微不足道的事情。

更新:这是我目前使用的脚本。

#!/bin/env ruby
# encoding: utf-8

require 'rubygems'
require 'nokogiri'
require 'open-uri'

URL = 'http://www.eximsystems.com/LaVerdad/Antiguo/Gn/Genesis.htm'
html = Nokogiri.HTML(open(URL))

# Extract Paragraphs
text = ''
html.css('p').each do |p|
  text += p.text
end

# Clean Up Text
text.gsub!(/\s+/, ' ')

puts text

这是包含我尝试删除的不可见字符的文本示例。数字 16 之前的空格就是我所说的。

  

cobraron aliento para conversarconél。 16 Alpuntócorriólavoz,y   seindulgógeneralmenteesta noticia en el palacio del rey:Han

2 个答案:

答案 0 :(得分:3)

如果没有看到您的代码,很难确切地知道您发生了什么。但是,我会指出String#force_encoding不会对字符串进行转码;这是一种说法,“不,真的,这是UTF-8”,例如。要从一种编码转码到另一种编码,请使用String#encode

这似乎对我有用:

require 'net/http'
s = Net::HTTP.get('www.eximsystems.com', '/LaVerdad/Antiguo/Gn/Genesis.htm')
s.force_encoding('windows-1252')
s.encode!('utf-8')

通常,/[[:space:]]/应该捕获更多种类/\s/(相当于/[ \t\r\n\f]/)的空白,但在这种情况下似乎没有必要。此时我在s找不到任何异常的空白。如果您仍然遇到问题,则需要发布代码并更准确地说明问题。

更新:感谢您使用代码更新问题并提供问题示例。看起来问题是不间断的空间。我认为从源头上摆脱它们是最简单的:

require 'nokogiri'
require 'open-uri'

URL = 'http://www.eximsystems.com/LaVerdad/Antiguo/Gn/Genesis.htm'
s = open(URL).read            # Separate these three lines to convert  
s.gsub!(' ', ' ')        #  to normal ' ' in source rather than after
html = Nokogiri.HTML(s)       #  conversion to unicode non-breaking space

# Extract Paragraphs
text = ''
html.css('p').each do |p|
  text += p.text
end

# Clean Up Text
text.gsub!(/\s+/, ' ')

puts text

现在只有一个正常的空间,在15月末和16号之间:

  

15)BesótambiénJoséatodos sus hermanos,orando sobre cada uno de ellos; despuésdecuyas demostraciones cobraron aliento para conversarconél。 16 Alpuntócorriólavoz,ysedivulgógeneralmenteesta noticia en el palacio del rey:Han venido los hermanosdeJosé; yorgósedeelloFaraónytoda su corte。

答案 1 :(得分:0)

您可以尝试使用text.strip删除空格。