Принудительные строки к UTF-8 из любой кодировки
В моем приложении rails я работаю с RSS-каналами со всего мира, а некоторые каналы имеют ссылки, которые не находятся в UTF-8. Исходные фид ссылки находятся вне моего контроля, и для того, чтобы использовать их в других частях приложения, они должны быть в UTF-8.
Как я могу обнаружить кодировку и преобразовать в UTF-8?
Ответы
Ответ 1
Ruby 1.9
"Форсировать" кодировку легко, однако она не будет конвертировать символы, просто изменив кодировку:
str = str.force_encoding("UTF-8")
str.encoding.name # => 'UTF-8'
Если вы хотите выполнить преобразование, используйте encode
:
begin
str.encode("UTF-8")
rescue Encoding::UndefinedConversionError
# ...
end
Я бы определенно прочитал следующее сообщение для получения дополнительной информации:
http://graysoftinc.com/character-encodings/ruby-19s-string
Ответ 2
Это обеспечит правильную кодировку и не будет выходить из строя, поскольку она заменяет любой недопустимый или undefined символ пустой строкой.
Это обеспечит независимо от того, что у вас есть допустимая строка UTF-8
str.encode(Encoding.find('UTF-8'), {invalid: :replace, undef: :replace, replace: ''})
Ответ 3
Iconv
require 'iconv'
i = Iconv.new('UTF-8','LATIN1')
a_with_hat = i.iconv("\xc2")
Резюме: iconv gem выполняет всю работу по преобразованию кодировок. Убедитесь, что он установлен с помощью:
gem install iconv
Теперь вам нужно знать, что кодировка вашей строки в настоящее время происходит, поскольку Ruby 1.8 рассматривает строки как массив байтов (без встроенной кодировки). Например, скажем, ваша строка была в latin1, и вы хотели преобразовать ее в utf -8
require 'iconv'
string_in_utf8_encoding = Iconv.conv("UTF8", "LATIN1", string_in_latin1_encoding)