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 для удаления пробелов.