2013-05-24 2 views
2

Я работаю с текстом, исходящим от this website с windows-1252 charset. Преобразование текста в UTF-8 было выполнено с использованием force_encoding, но текст по-прежнему содержит пробелы, от которых я не могу избавиться. Пробел нельзя удалить, используя text.gsub!(/\s/, ' ') или аналогичную технику.Ruby: Удалите невидимые символы после преобразования строки в UTF-8

Драгоценный камень iconv также не выполняет трюк - как описано here. Понятно, что пробел является остатком исходного текста и кодировкой windows-1252, поскольку я получаю предупреждение invalid multibyte char (US-ASCII), если я не указываю кодировку как UTF-8.

Я не специалист по кодированию текста, поэтому я, возможно, не замечаю ничего тривиального.

Обновление: Это сценарий, который я использую в настоящее время.

#!/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 

Это образец текста, который содержит невидимые символы, которые я пытаюсь удалить. Пространство перед номером - это то, о чем я говорю.

cobraron aliento para consar con él. 16 Al Пунто corrió Ла Вос, у себе divulgó generalmente Эста noticia ан-эль Паласио-дель-Рей: Хан

+0

Можете ли вы вставить символ пробела, который вы пытаетесь удалить? – mdesantis

+0

@ProGNOMmers Я обновил вопрос с помощью скрипта Ruby и образца текста, включая невидимые пробелы. –

ответ

2

Не видя код, это трудно, чтобы точно знать, что происходит для вас. Однако я укажу, что 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) Beso 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.

+0

Я обновил вопрос с помощью скрипта Ruby. Я также пробовал ваш подход, но я не получаю результат, который вы видите, т. Е. Полученный текст по-прежнему содержит невидимые символы/пробелы. –

+1

@BartJacobs Спасибо за обновление вашего вопроса. Я обновил свой ответ. С вашим обновлением стало ясно, что это вовсе не проблема с кодировкой; это было ' ' в HTML, превращаясь в неразрывное пространство в вашем тексте. –

+0

Фантастический. Для справки о будущем, как вы обнаружили незащищенные пространства, был виновником? –

0

Вы можете попытаться использовать text.strip для удаления пробелов.

+1

[String # strip] (http://www.ruby-doc.org/core-2.0/String.html#method-i-strip) удаляет только начальные и конечные пробелы. И я не уверен, но я подозреваю, что было бы не намного лучше поймать необычные пробелы, чем '/ \ s /'. –