#encode和#force_encoding在ruby上有什么区别?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

我真的不明白在Ruby中的String类中二者之间的差别#encode、#force_encoding。我知道这"kam".force_encoding("UTF-8")会强制"kam"使用UTF-8编码,但这有什么不同?

http://ruby-doc.org/core-2.0/String.html#method-i-encoding

提问于
用户回答回答于

差别很大。force_encoding设置给定的字符串编码,但不更改字符串本身,即不改变它在内存中的表示形式:

'łał'.bytes #=> [197, 130, 97, 197, 130]
'łał'.force_encoding('ASCII').bytes #=> [197, 130, 97, 197, 130]
'łał'.force_encoding('ASCII')   #=> "\xC5\x82a\xC5\x82"

Encode假定当前编码正确,并试图更改字符串,因此在第二次编码中读取方式相同:

'łał'.encode('UTF-16') #=> 'łał'
'łał'.encode('UTF-16').bytes #=> [254, 255, 1, 65, 0, 97, 1, 66] 

总之,force_encoding更改从字节读取字符串的方式,以及encode更改字符串的写入方式,而不更改输出(如果可能的话)

用户回答回答于

读这个http://ruby-doc.org/core-2.1.0/Encoding.html#class-Encoding-label-Changing+an+encoding

字符串的关联编码可以通过两种不同的方式更改。 首先,可以设置Encoding将字符串转换为新的编码,而不更改字符串的内部字节表示形式,String#force_encoding...。这就是如何告诉Ruby字符串的正确编码。

例子:

string = "R\xC3\xA9sum\xC3\xA9"
string.encoding #=> #<Encoding:ISO-8859-1>
string.force_encoding(Encoding::UTF_8) #=> "R\u00E9sum\u00E9"

第二,有可能转码字符串,即将其内部字节表示转换为另一种编码。它的关联编码也被设置为其他编码。见String#encode用于各种形式的转码,以及编码::转换器类的附加控件。转码过程。

例子:

string = "R\u00E9sum\u00E9"
string.encoding #=> #<Encoding:UTF-8>
string = string.encode!(Encoding::ISO_8859_1)
#=> "R\xE9sum\xE9"
string.encoding
#=> #<Encoding::ISO-8859-1>

扫码关注云+社区