Ruby: удаление невидимых символов после преобразования строки в UTF-8

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

Драгоценный камень iconv тоже не справляется - как объяснено здесь. Ясно, что пробел является остатком исходного текста и 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

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

Cobraron Aliento Para Convesar Con él.   16 Аль-Пунто-Коррио-ла-Воз, как и прежде, в общем наследии, в том числе в ан-паласио-дель-Рей: Хан

2 ответа

Решение

Не видя ваш код, трудно точно знать, что происходит для вас. Однако я укажу, что String#force_encoding не транскодирует String; это, например, способ сказать: "Нет, действительно, это 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) Бесу тамбиен Хосе а тодос с херманос, орандо собре када уно де эллос; después de cuyas demostraciones cobraron aliento para spokar con él. 16 Аль-Пунто-Коррио-ла-Воз, как и прежде, с общеизвестным положением дел в Эль-Паласио-дель-Рей: Хан Венидо лос Херманос де Хосе; и слава богу.

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

Другие вопросы по тегам