2

方法中是否有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
4

3 回答 3

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")
于 2013-06-10T13:02:22.367 回答
2

对于另一个简短的回答,我深表歉意。显然,#force_encoding修改了字符串属性,但我不会称之为破坏性。您可以随时撤消更改。如果你想吃你的蛋糕,吃它,#dup它。

于 2013-06-10T13:11:19.127 回答
0

另一种解决方案:

a = "Ü"
b = ::String.new a, :encoding => "binary"

我更喜欢它dup

于 2019-08-07T20:12:59.123 回答