Iconv и Kconv на Ruby (1.9.2)
Я знаю, что Iconv используется для преобразования кодировки строк. Из моего понимания Kconv предназначен для той же цели (я не прав?).
Мой вопрос: в чем разница между ними, и что я должен использовать для кодирования конверсий.
Кстати, нашел информацию о том, что Iconv устареет с версии 1.9.3.
1 ответ
Как говорит jtbandes, выглядит Kconv
как Iconv
но специализируется на кандзи ("логографические китайские иероглифы, которые используются в современной японской письменности наряду с хирагана" http://en.wikipedia.org/wiki/Kanji). Если вы не работаете над чем-то конкретно японским, я думаю, вам не нужно Kconv
,
Если вы используете Ruby 1.9, вы можете использовать встроенную поддержку кодирования большую часть времени вместо Iconv
, Я часами пытался понять, что я делал, пока не прочитал это:
http://www.joelonsoftware.com/articles/Unicode.html
Тогда вы можете начать использовать такие вещи, как
String#encode # Ruby 1.9
String#encode! # Ruby 1.9
String#force_encoding # Ruby 1.9
с уверенностью. Если у вас есть более сложные потребности, прочитайте http://blog.grayproductions.net/categories/character_encodings
ОБНОВЛЕНО Спасибо JohnZ в комментариях
Iconv
все еще полезен в Ruby 1.9, потому что он может транслитерировать символы (то, что String#encode
и другие. не могу сделать). Вот пример того, как продлить String
с функцией транслитерации в UTF-8:
require 'iconv'
class ::String
# Return a new String that has been transliterated into UTF-8
# Should work in Ruby 1.8 and Ruby 1.9 thanks to http://po-ru.com/diary/fixing-invalid-utf-8-in-ruby-revisited/
def as_utf8(from_encoding = 'UTF-8')
::Iconv.conv('UTF-8//TRANSLIT', from_encoding, self + ' ')[0..-2]
end
end
"foo".as_utf8 #=> "foo"
"foo".as_utf8('ISO-8859-1') #=> "foo"
Спасибо JohnZ!