7

如果您没有在它们之间进行转换,则(日期)时间的时区和字符串的编码没有问题。在 Ruby 1.9 和 2.0 中,编码似乎是旧 Ruby 版本的新时区,它们只会带来麻烦。Iconv已被本机编码功能取代。如何从标准UTF-8转换为ISO-8859-1,例如在 Windows 系统中使用?在 Ruby 2.0 控制台中,encode 函数不起作用,尽管它应该能够通过encode(dst_encoding, src_encoding) → str?将源编码转换为目标编码。

>> "ABC äöüÄÖÜ".encoding
=> #<Encoding:UTF-8>
>> "ABC äöüÄÖÜ".encode("UTF-8").encode("ISO-8859-1")
=> "ABC \xE4\xF6\xFC\xC4\xD6\xDC"
>> "ABC äöüÄÖÜ".encode("ISO-8859-1","UTF-8")
=> "ABC \xE4\xF6\xFC\xC4\xD6\xDC"

我在 linux 系统上使用 Ruby 2.0.0(修订版 41674)。

4

1 回答 1

10

encode方法确实有效。

让我们用 U+00FC ( ü) 创建一个字符串:

uuml_utf8 = "\u00FC"       #=> "ü"

Ruby 用 UTF-8 编码这个字符串:

uuml_utf8.encoding         #=> #<Encoding:UTF-8>

在 UTF-8 中,ü表示为195 188(十进制):

uuml_utf8.bytes            #=> [195, 188]

现在让我们将字符串转换为 ISO-8859-1:

uuml_latin1 = uuml_utf8.encode("ISO-8859-1")

uuml_latin1.encoding       #=> #<Encoding:ISO-8859-1>

在 ISO-8859-1 中,ü表示为252(十进制):

uuml_latin1.bytes          #=> [252]

然而,在 UTF-8 中252是无效序列。这就是您的终端/控制台显示替换字符“�”(U+FFFD)或根本不显示字符的原因。

为了显示 ISO-8859-1 编码字符,您也必须将终端/控制台切换到该编码。

于 2013-10-09T19:01:58.763 回答