Ruby上的Iconv和Kconv(1.9.2)

时间:2011-06-26 18:58:09

标签: ruby character-encoding iconv

我知道Iconv用于转换字符串的编码。 根据我的理解,Kconv也是出于同样的目的(我错了吗?)。

我的问题是:它们之间有什么区别,我应该用什么来编码转换。

btw发现一些信息表明Iconv将从1.9.3版本弃用。

1 个答案:

答案 0 :(得分:5)

正如https://stackoverflow.com/users/23649/jtbandes所说,Kconv看起来像Iconv,但专门用于汉字(“现代日语书写系统中使用的字形汉字以及平假名”{{ 3}})。除非你正在研究特别是日语的东西,否则我猜你不需要Kconv

如果您使用的是Ruby 1.9,则可以使用内置编码支持,而不是Iconv。在我读到这篇文章之前,我试了几个小时才明白我在做什么:

http://en.wikipedia.org/wiki/Kanji

然后你可以开始使用像

这样的东西了
String#encode           # Ruby 1.9
String#encode!          # Ruby 1.9
String#force_encoding   # Ruby 1.9
充满信心。如果您有更复杂的需求,请阅读http://www.joelonsoftware.com/articles/Unicode.html

更新感谢JohnZ的评论

Iconv在Ruby 1.9中仍然有用,因为它可以音译字符(String#encode等人无法做到的事情)。以下是如何使用音译为UTF-8的函数扩展String的示例:

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!