2014-02-06 69 views
19

我真的不明白#encode#force_encoding在Ruby中對於String類的區別。我知道"kam".force_encoding("UTF-8")會強制"kam"使用UTF-8編碼,但#encode(encoding)#encode(encoding)有什麼不同?ruby​​中的#encode和#force_encoding有什麼區別?

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

+2

甲你在談論'String#encode'還是'String#encoding'?我猜'String#encode',但你提到了這兩種方法並鏈接到'String#encoding'。 –

回答

24

差異是相當大的。 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改變字符串被寫入的方式,而不改變輸出(如果可能)

10

閱讀本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瞭解各種形式的代碼轉換,以及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> 
相關問題