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

如何在Ruby 2.0中将UTF-8转换为ISO-8859-1?,ruby,encoding,utf-8,character-encoding,Ruby,Encoding,Utf 8,Character Encoding,(日期)时区-如果您不必在时间和字符串之间进行转换,那么字符串的时间和编码就没有问题。在Ruby 1.9和2.0中,编码似乎是旧Ruby版本的新时区,它们只会带来麻烦。已被本机编码函数替换。如何从标准转换为,例如,在Windows系统中使用?在Ruby 2.0控制台中,虽然它应该能够通过encode(dst_编码,src_编码)从源编码转换为目标编码,但它不起作用→ str >> "ABC äöüÄÖÜ".encoding => #<Encoding:UTF-8>

(日期)时区-如果您不必在时间和字符串之间进行转换,那么字符串的时间和编码就没有问题。在Ruby 1.9和2.0中,编码似乎是旧Ruby版本的新时区,它们只会带来麻烦。已被本机编码函数替换。如何从标准转换为,例如,在Windows系统中使用?在Ruby 2.0控制台中,虽然它应该能够通过
encode(dst_编码,src_编码)从源编码转换为目标编码,但它不起作用→ 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"
>“ABCäöü196;äÜ”。编码
=> #
>>“ABCäöü196ÖÜ”。编码(“UTF-8”)。编码(“ISO-8859-1”)
=>“ABC\xE4\xF6\xFC\xC4\xD6\xDC”
>>“ABCäöü196ÖÜ”。编码(“ISO-8859-1”、“UTF-8”)
=>“ABC\xE4\xF6\xFC\xC4\xD6\xDC”
我在linux系统上使用Ruby 2.0.0(修订版41674)。

该方法确实有效

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

Ruby用UTF-8编码此字符串:

uuml_utf8.encoding         #=> #<Encoding:UTF-8>
现在,让我们将字符串转换为ISO-8859-1:

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

uuml_latin1.encoding       #=> #<Encoding:ISO-8859-1>
然而,在UTF-8中,
252
是无效序列。这就是终端/控制台显示替换字符的原因”�" (U+FFFD)或根本没有字符


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

有什么问题?
“ABCäöü196ÖÜ”。编码(“ISO-8859-1”,“UTF-8”)
将UTF-8转换为拉丁语-1并返回拉丁语-1字符串,
“ABCäü196;ÖÜÜ”“
已经是UTF-8,因此
encode
的第二个参数不相关。您希望
“ABCäöü196;ÖÜ”.encode(“ISO-8859-1”、“UTF-8”)
做什么?您的期望与实际发生的情况有何不同?字符串“ABC\xE4\xF6\xFC\xC4\xD6\xDC”在我看来不像是具有有效编码的文本,是吗?至少特殊字符没有正确显示。目标是将UTF-8字符串转换为Excel导入。到目前为止,它似乎并不奏效。这个想法是,如果我设法将UTF-8转换为ISO-8859-1,那么Excel也将在Windows上导入和显示文本。这是一个在UTF-8终端中显示的拉丁-1编码字符串。是的,但在您的示例中,uuml_拉丁1的值为“\xFC”,而不是特殊字符“ü”打印uuml_拉丁语1'给出� , 而“puts uuml_latin1”生成一个空字符串。似乎出了问题,或者Ruby函数无法显示ISO-8859-1编码?0xFC确实是252的十六进制值。这意味着Ruby 2.0无法使用正确的字符正确显示ISO-8859-1编码的字符串?为什么它可以使用UTF-8编码,而不能使用ISO-8859-1编码?Ruby不显示字符串,终端显示。将其从UTF-8更改为ISO-8859-1,您将看到一个
ü
。好的,因此编码似乎错误的原因是终端/控制台/bash无法显示它,因为它具有错误的区域设置/字符集/字符映射/任何内容。@ArupRakshit 192-193和245-255(红色单元格)无效
uuml_utf8.bytes            #=> [195, 188]
uuml_latin1 = uuml_utf8.encode("ISO-8859-1")

uuml_latin1.encoding       #=> #<Encoding:ISO-8859-1>
uuml_latin1.bytes          #=> [252]