2

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

iconv gem 也不能解决问题 - 如此处所述。很明显,如果我没有将编码指定为 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 conversar con él。16 Al punto corrió la voz, y se divulgó generalmente esta noticia en el palacio del rey: Han

4

2 回答 2

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én José a todos sus hermanos, orando sobre cada uno de ellos; después de cuyas demostraciones cobraron aliento para conversar con él。16 Al punto corrió la voz, y se divulgó generalmente esta noticia en el palacio del rey:Han venido los hermanos de José;y holgóse de ello Faraón y toda su corte。

于 2013-05-24T07:40:49.530 回答
0

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

于 2013-05-24T08:20:32.427 回答