对于#encode
类,我真的不明白Ruby中#force_encoding
和String
之间的区别。我了解"kam".force_encoding("UTF-8")
会强制"kam"
采用UTF-8编码,但#encode(encoding)
有何不同?
答案 0 :(得分:27)
差异很大。 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"
编码假设当前编码是正确的,并尝试更改字符串,使其在第二次编码中读取相同的方式:
'łał'.encode('UTF-16') #=> 'łał'
'łał'.encode('UTF-16').bytes #=> [254, 255, 1, 65, 0, 97, 1, 66]
简而言之,force_encoding
更改从字节读取字符串的方式,encode
更改字符串的写入方式而不更改输出(如果可能)
答案 1 :(得分:13)
可以通过两种不同的方式更改相关的字符串编码。
首先,可以将字符串的
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
;有关转码流程的其他控制权,请参见Encoding::Converter类。
示例:
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>