方法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
答案 0 :(得分:5)
force_encoding
在不改变接收者字节方面是非破坏性的。它只是改变了字节的解释方式,即它改变了字符串的字符:
a = "Ü"
a.bytes.to_a #=> [195, 156]
a.chars.to_a #=> ["Ü"]
a.force_encoding("BINARY")
a.bytes.to_a #=> [195, 156]
a.chars.to_a #=> ["\xC3", "\x9C"]
编码存储在字符串实例中。要获得“二进制”编码的副本,请使用:
a.dup.force_encoding("BINARY")
答案 1 :(得分:2)
我为另一个简短的回答深表歉意。显然,#force_encoding
修改了字符串属性,但我不会把它称为破坏性的。您始终可以撤消更改。如果你想吃蛋糕,并且吃它,#dup
它。
答案 2 :(得分:0)
另一种解决方案:
a = "Ü"
b = ::String.new a, :encoding => "binary"
我更喜欢dup
。