2010-11-05 388 views

回答

21

紅寶石已經具有String#each_byte方法,其別名爲String#bytes

在Ruby 1.9之前,字符串等同於字節數組,即字符被假定爲單個字節。對於ASCII文本和各種文本編碼(如Win-1252ISO-8859-1),這很好,但在Unicode上出現了嚴重錯誤,我們在網絡上越來越頻繁地看到它。 Ruby 1.9+支持Unicode,字符串不再被認爲是由字節組成,而是由多個字節組成的字符組成。

因此,如果您試圖將文本操作爲單個字節,則需要確保您的輸入爲ASCII或至少一個基於單字節的字符集。如果您可能有多字節字符,則應使用String#each_charString.split(//)String.unpack以及U標誌。


是什麼//意味着String.split(//)

//是一樣的使用''。要麼告訴split返回字符。您通常也可以使用chars

+7

'「фыв」.bytes.to_a => [209,132,209,139,208,178]' - unicode字符串的字節。提問者需要字節,而不是字符。我沒有看到任何問題。或者我沒有看到什麼? – Nakilon 2010-11-05 17:20:27

+1

是的,我說已經有'each_byte'和'bytes'方法可用,所以不需要用'to_bytes'方法擴展String。關於Unicode字符和字節:是的,您可以輕鬆地將字符轉換爲其組件字節,但不能像處理單個字符那樣操作它們,因爲某些字節不是字符值,而是指示如何修改字符。任何人如果不知道這一點,並且希望將文本當作字節處理,那麼當他們第一次遇到Unicode時,將會有很大的覺醒。 – 2010-11-05 20:19:40

+0

'String.split(//)'中的'//'meain是什麼? – 2014-11-17 11:52:10

35

String#bytes通過字符串字節返回枚舉數。 .to_a可以將其轉換爲數組。

"asd".bytes.to_a 
=> [97, 115, 100] 
0

在解壓的幫助下,我們可以將字符串轉換爲任何格式: - 字節,咬(MSB,LSB),ASCII或十六進制。請通過以下鏈接: - http://blog.bigbinary.com/2011/07/20/ruby-pack-unpack.html。將字符串轉換爲字節: -

"abcde".unpack('c*') 
=> [97, 98, 99, 100, 101]