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")(もちろん、以前はUTF-8であったと仮定しaます)。文字列のバイトは変更されません。ただし、文字列の状態が変更されるため、このメソッドは破壊的です。例えば:

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 に答える