【发布时间】:2013-06-10 12:47:45
【问题描述】:
方法force_encoding 中是否有不修改调用者对象的版本?
所以,当前的 force_encoding 是这样工作的:
> a
=> "Ü"
> a.force_encoding("BINARY")
=> "\xC3\x9C"
> a
=> "\xC3\x9C"
我希望结果是这样的:
> a
=> "Ü"
> a.force_encoding_non_destructive("BINARY")
=> "\xC3\x9C"
> a
=> "Ü"
请注意,我完全理解 a.force_encoding("UTF-16LE").force_encoding("UTF-8") 产生相同的结果(当然,假设 a 以前是 UTF-8)并且字符串中的字节没有被修改。但是,字符串状态被修改,因此这种方法是破坏性的。例如:
a="a"
a.freeze
a.force_encoding("BINARY")
# raises error
【问题讨论】:
-
我认为您误解了
force_encoding在您的示例中的实际作用。它不会以任何方式修改字符串的内容。相反,它正在更改字符串的一个属性——控制它如何呈现给您的属性。 -
@Denis 我相信你错了。在您的控制台中尝试此操作:
a = "a" ; b = "b" ; a + b。然后,试试这个:a = "a" ; b = "b" ; a + b ; a.force_encoding("UTF-16LE"); a + b。如果同一语句在调用其中一个对象中的方法后生成不同的输出,则表明该方法修改了对象状态。 -
保持。更改为
UTF-16LT与更改为二进制(您在示例中使用)不同。 :-) 二进制就是……字节流。UTF-8和UTF-16对相同的字符进行不同的编码,并相应地修改字符串(如果可能)。相比之下,据我所知,将字符串强制为二进制会产生完全相同的字符串。 -
是的,对象的编码属性已经改变。但不是字符串本身,当您切换到二进制编码并返回时。