如何在Ruby 2.0中将UTF-8转换为ISO-8859-1?

7
(日期)时区和字符串编码不会成为问题,如果你不需要在它们之间进行转换。在 Ruby 1.9 和 2.0 中,编码似乎是旧版 Ruby 的新时区,它们只会带来麻烦。Iconv 已被本地编码函数取代。例如,如何从标准的 UTF-8 转换为 ISO-8859-1,以便在 Windows 系统中使用?在 Ruby 2.0 控制台中,encode function 不起作用,尽管它应该能够通过 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)。


1
什么问题?"ABC äöüÄÖÜ".encode("ISO-8859-1","UTF-8") 将 UTF-8 转换为 Latin-1 并返回 Latin-1 字符串,"ABC äöüÄÖÜ" 已经是 UTF-8,因此 encode 的第二个参数是无关紧要的。你期望 "ABC äöüÄÖÜ".encode("ISO-8859-1","UTF-8") 做什么,以及你的期望与实际发生的有何不同? - mu is too short
字符串 "ABC \xE4\xF6\xFC\xC4\xD6\xDC" 对我来说看起来不像是一个有效编码的文本,或者说它是吗?至少特殊字符没有正确显示。目标是将UTF-8字符串转换为Excel导入。到目前为止,似乎并不顺利。想法是如果我能够将UTF-8转换为ISO-8859-1,那么Excel也将在Windows上导入和显示这些文本。 - 0x4a6f4672
1
这是一个 Latin-1 编码的字符串在 UTF-8 终端中显示。 - mu is too short
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编码的字符,你需要将终端/控制台切换到该编码。


是的,但在您的示例中uuml_latin1的值为"\xFC"而不是特殊字符"ü"。'print uuml_latin1'输出� ,而'puts uuml_latin1'则产生一个空字符串。似乎有些问题,或者Ruby函数不能显示ISO-8859-1编码? - 0x4a6f4672
0xFC 确实是十六进制值为 252。这意味着 Ruby 2.0 无法正确显示使用 ISO-8859-1 编码的字符串,使用正确的字符?为什么它可以使用 UTF-8 编码,但不能使用 ISO-8859-1 编码? - 0x4a6f4672
Ruby不会显示字符串,是你的终端在显示。将它从UTF-8更改为ISO-8859-1,你就能看到一个ü - Stefan
确切地说,0xFC 不是一个有效的 UTF-8 序列。这就像在 UTF-8 编辑器中打开 ISO-8859-1 文件一样。 - Stefan
1
@ArupRakshit http://en.wikipedia.org/wiki/UTF-8#Codepage_layout 192-193和245-255(红色单元格)是无效的。 - Stefan
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接