2016-11-28 106 views
3

是什麼紅寶石字符串函數的區別碼點: - 代碼點和字節字節VS在紅寶石

'abcd'.bytes 
=> [97, 98, 99, 100] 

'abcd'.codepoints 
=> [97, 98, 99, 100] 
+2

嘗試使用unicode字符串 –

+0

添加到@ SergioTulentsev的評論'「\ u2713」.bytes = [226,156,147]',而''\ u2713「.codepoints = [10003]'。 –

+0

@SergioTulentsev所以,codepoints是爲unicode字符串。那麼爲什麼中文字符會返回不同的結果 –

回答

7

bytes返回單個字節,無論焦炭的大小,而codepoints回報Unicode代碼點。

s = '日本語' 
s.bytes # => [230, 151, 165, 230, 156, 172, 232, 170, 158] 
s.codepoints # => [26085, 26412, 35486] 
s.chars # => ["日", "本", "語"] 

我看到你的困惑來自哪裏。 Ruby現在默認使用utf-8編碼,而utf-8是專門設計的,所以它的第一個代碼點(0-127)正好是,與ASCII編碼中的完全相同。 ASCII是一個單字節字符的編碼,所以在您的問題方法bytescodepoints的示例中返回相同的值,重合

因此,如果您需要將字符串拆分爲字符,請使用charscodepoints(以適合您的用例爲準)。僅當您將字符串視爲不透明二進制blob而不是文本時才使用bytes

+1

爲了驗證這些字節是否相應,你可以執行's.bytes.pack('c *')。force_encoding('UTF-8')== s'這應該是真的。 –

+0

@sergio Tulentsev你可以告訴我爲什麼我們使用codepoints –

+0

@ Vivakkumar:「我們爲什麼使用codepoints」 - 我們是誰,我們在哪裏使用它們?恐怕我不明白這個問題。你沒有看到更新的答案嗎? –