Подтвердить что ты не робот

Принудительные строки к UTF-8 из любой кодировки

В моем приложении rails я работаю с RSS-каналами со всего мира, а некоторые каналы имеют ссылки, которые не находятся в UTF-8. Исходные фид ссылки находятся вне моего контроля, и для того, чтобы использовать их в других частях приложения, они должны быть в UTF-8.

Как я могу обнаружить кодировку и преобразовать в UTF-8?

4b9b3361

Ответ 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)