Ruby 字符串(String)

Ruby 中的 String 對(duì)象用于存儲(chǔ)或操作一個(gè)或多個(gè)字節(jié)的序列。

Ruby 字符串分為單引號(hào)字符串(')和雙引號(hào)字符串("),區(qū)別在于雙引號(hào)字符串能夠支持更多的轉(zhuǎn)義字符。

單引號(hào)字符串

最簡(jiǎn)單的字符串是單引號(hào)字符串,即在單引號(hào)內(nèi)存放字符串:

'這是一個(gè) Ruby 程序的字符串'

如果您需要在單引號(hào)字符串內(nèi)使用單引號(hào)字符,那么需要在單引號(hào)字符串使用反斜杠(\),這樣 Ruby 解釋器就不會(huì)認(rèn)為這個(gè)單引號(hào)字符是字符串的終止符號(hào):

'Won\'t you read O\'Reilly\'s book?'

反斜杠也能轉(zhuǎn)義另一個(gè)反斜杠,這樣第二個(gè)反斜杠本身不會(huì)解釋為轉(zhuǎn)義字符。

以下是 Ruby 中字符串相關(guān)的特性。

雙引號(hào)字符串

在雙引號(hào)字符串中我們可以使用 #{} 井號(hào)和大括號(hào)來(lái)計(jì)算表達(dá)式的值:

字符串中嵌入變量:

在線示例

#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
 
name1 = "Joe"
name2 = "Mary"
puts "你好 #{name1},  #{name2} 在哪?"

以上示例輸出運(yùn)行輸出結(jié)果為:

你好 Joe,  Mary 在哪?

字符串中進(jìn)行數(shù)學(xué)運(yùn)算:

在線示例

#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
 
x, y, z = 12, 36, 72
puts "x 的值為 #{ x }"
puts "x + y 的值為 #{ x + y }"
puts "x + y + z 的平均值為 #{ (x + y + z)/3 }"

以上示例輸出運(yùn)行輸出結(jié)果為:

x 的值為 12
x + y 的值為 48
x + y + z 的平均值為 40

Ruby 中還支持一種采用 %q 和 %Q 來(lái)引導(dǎo)的字符串變量,%q 使用的是單引號(hào)引用規(guī)則,而 %Q 是雙引號(hào)引用規(guī)則,后面再接一個(gè) (! [ { 等等的開(kāi)始界定符和與 } ] ) 等等的末尾界定符。

跟在 q 或 Q 后面的字符是分界符.分界符可以是任意一個(gè)非字母數(shù)字的單字節(jié)字符.如:[,{,(,<,!等,字符串會(huì)一直讀取到發(fā)現(xiàn)相匹配的結(jié)束符為止.

在線示例

#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
 
desc1 = %Q{Ruby 的字符串可以使用 '' 和 ""。}
desc2 = %q|Ruby 的字符串可以使用 '' 和 ""。|
 
puts desc1
puts desc2

以上示例輸出運(yùn)行輸出結(jié)果為:

Ruby 的字符串可以使用 '' 和 ""。
Ruby 的字符串可以使用 '' 和 ""。

轉(zhuǎn)義字符

下標(biāo)列出了可使用反斜杠符號(hào)轉(zhuǎn)義的轉(zhuǎn)義字符或非打印字符。

注意:在一個(gè)雙引號(hào)括起的字符串內(nèi),轉(zhuǎn)義字符會(huì)被解析。在一個(gè)單引號(hào)括起的字符串內(nèi),轉(zhuǎn)義字符不會(huì)被解析,原樣輸出。

反斜杠符號(hào)十六進(jìn)制字符描述
\a0x07報(bào)警符
\b0x08退格鍵
\cx Control-x
\C-x Control-x
\e0x1b轉(zhuǎn)義符
\f0x0c換頁(yè)符
\M-\C-x Meta-Control-x
\n0x0a換行符
\nnn 八進(jìn)制表示法,其中 n 的范圍為 0.7
\r0x0d回車符
\s0x20空格符
\t0x09制表符
\v0x0b垂直制表符
\x 字符 x
\xnn 十六進(jìn)制表示法,其中 n 的范圍為 0.9、 a.f 或 A.F

字符編碼

Ruby 的默認(rèn)字符集是 ASCII,字符可用單個(gè)字節(jié)表示。如果您使用 UTF-8 或其他現(xiàn)代的字符集,字符可能是用一個(gè)到四個(gè)字節(jié)表示。

您可以在程序開(kāi)頭使用 $KCODE 改變字符集,如下所示:

$KCODE = 'u'

下面是 $KCODE 可能的值。

編碼描述
aASCII (與 none 相同)。這是默認(rèn)的。
eEUC。
nNone (與 ASCII 相同)。
uUTF-8。

字符串內(nèi)建方法

我們需要有一個(gè) String 對(duì)象的示例來(lái)調(diào)用 String 方法。下面是創(chuàng)建 String 對(duì)象示例的方式:

new [String.new(str="")]

這將返回一個(gè)包含 str 副本的新的字符串對(duì)象。現(xiàn)在,使用 str 對(duì)象,我們可以調(diào)用任意可用的示例方法。例如:

在線示例

#!/usr/bin/ruby
 
myStr = String.new("THIS IS TEST")
foo = myStr.downcase
 
puts "#{foo}"

這將產(chǎn)生以下結(jié)果:

this is test

下面是公共的字符串方法(假設(shè) str 是一個(gè) String 對(duì)象):

序號(hào)方法 & 描述
1str % arg
使用格式規(guī)范格式化字符串。如果 arg 包含一個(gè)以上的代替,那么 arg 必須是一個(gè)數(shù)組。如需了解更多格式規(guī)范的信息,請(qǐng)查看"內(nèi)核模塊"下的 sprintf。
2str * integer
返回一個(gè)包含 integer 個(gè) str 的新的字符串。換句話說(shuō),str 被重復(fù)了 integer 次。
3str + other_str
連接 other_str 到 str。
4str << obj
連接一個(gè)對(duì)象到字符串。如果對(duì)象是范圍為 0.255 之間的固定數(shù)字 Fixnum,則它會(huì)被轉(zhuǎn)換為一個(gè)字符。把它與 concat 進(jìn)行比較。
5str <=> other_str
把 str 與 other_str 進(jìn)行比較,返回 -1(小于)、0(等于)或 1(大于)。比較是區(qū)分大小寫的。
6str == obj
檢查 str 和 obj 的相等性。如果 obj 不是字符串,則返回 false,如果 str <=> obj,則返回 true,返回 0。
7str =~ obj
根據(jù)正則表達(dá)式模式 obj 匹配 str。返回匹配開(kāi)始的位置,否則返回 false。
8str[position] # 注意返回的是ASCII碼而不是字符
str[start, length]
str[start..end]
str[start...end]

使用索引截取子串
9str.capitalize
把字符串轉(zhuǎn)換為大寫字母顯示。
10str.capitalize!
與 capitalize 相同,但是 str 會(huì)發(fā)生變化并返回。
11str.casecmp
不區(qū)分大小寫的字符串比較。
12str.center
居中字符串。
13str.chomp
從字符串末尾移除記錄分隔符($/),通常是 \n。如果沒(méi)有記錄分隔符,則不進(jìn)行任何操作。
14str.chomp!
與 chomp 相同,但是 str 會(huì)發(fā)生變化并返回。
15str.chop
移除 str 中的最后一個(gè)字符。
16str.chop!
與 chop 相同,但是 str 會(huì)發(fā)生變化并返回。
17str.concat(other_str)
連接 other_str 到 str。
18str.count(str, ...)
給一個(gè)或多個(gè)字符集計(jì)數(shù)。如果有多個(gè)字符集,則給這些集合的交集計(jì)數(shù)。
19str.crypt(other_str)
對(duì) str 應(yīng)用單向加密哈希。參數(shù)是兩個(gè)字符長(zhǎng)的字符串,每個(gè)字符的范圍為 a.z、 A.Z、 0.9、 . 或 /。
20str.delete(other_str, ...)
返回 str 的副本,參數(shù)交集中的所有字符會(huì)被刪除。
21str.delete!(other_str, ...)
與 delete 相同,但是 str 會(huì)發(fā)生變化并返回。
22str.downcase
返回 str 的副本,所有的大寫字母會(huì)被替換為小寫字母。
23str.downcase!
與 downcase 相同,但是 str 會(huì)發(fā)生變化并返回。
24str.dump
返回 str 的版本,所有的非打印字符被替換為 \nnn 符號(hào),所有的特殊字符被轉(zhuǎn)義。
25str.each(separator=$/) { |substr| block }
使用參數(shù)作為記錄分隔符(默認(rèn)是 $/)分隔 str,傳遞每個(gè)子字符串給被提供的塊。
26str.each_byte { |fixnum| block }
傳遞 str 的每個(gè)字節(jié)給 block,以字節(jié)的十進(jìn)制表示法返回每個(gè)字節(jié)。
27str.each_line(separator=$/) { |substr| block }
使用參數(shù)作為記錄分隔符(默認(rèn)是 $/)分隔 str,傳遞每個(gè)子字符串給被提供的 block。
28str.empty?
如果 str 為空(即長(zhǎng)度為 0),則返回 true。
29str.eql?(other)
如果兩個(gè)字符串有相同的長(zhǎng)度和內(nèi)容,則這兩個(gè)字符串相等。
30str.gsub(pattern, replacement) [or]
str.gsub(pattern) { |match| block }

返回 str 的副本,pattern 的所有出現(xiàn)都替換為 replacement 或 block 的值。pattern 通常是一個(gè)正則表達(dá)式 Regexp;如果是一個(gè)字符串 String,則沒(méi)有正則表達(dá)式元字符被解釋(即,/\d/ 將匹配一個(gè)數(shù)字,但 '\d' 將匹配一個(gè)反斜杠后跟一個(gè) 'd')。
31str[fixnum] [or] str[fixnum,fixnum] [or] str[range] [or] str[regexp] [or] str[regexp, fixnum] [or] str[other_str]
使用下列的參數(shù)引用 str:參數(shù)為一個(gè) Fixnum,則返回 fixnum 的字符編碼;參數(shù)為兩個(gè) Fixnum,則返回一個(gè)從偏移(第一個(gè) fixnum)開(kāi)始截至到長(zhǎng)度(第二個(gè) fixnum)為止的子字符串;參數(shù)為 range,則返回該范圍內(nèi)的一個(gè)子字符串;參數(shù)為 regexp,則返回匹配字符串的部分;參數(shù)為帶有 fixnum 的 regexp,則返回 fixnum 位置的匹配數(shù)據(jù);參數(shù)為 other_str,則返回匹配 other_str 的子字符串。一個(gè)負(fù)數(shù)的 Fixnum 從字符串的末尾 -1 開(kāi)始。
32str[fixnum] = fixnum [or] str[fixnum] = new_str [or] str[fixnum, fixnum] = new_str [or] str[range] = aString [or] str[regexp] =new_str [or] str[regexp, fixnum] =new_str [or] str[other_str] = new_str ]
替換整個(gè)字符串或部分字符串。與 slice! 同義。
33str.gsub!(pattern, replacement) [or] str.gsub!(pattern) { |match| block }
執(zhí)行 String#gsub 的替換,返回 str,如果沒(méi)有替換被執(zhí)行則返回 nil。
34str.hash
返回一個(gè)基于字符串長(zhǎng)度和內(nèi)容的哈希。
35str.hex
把 str 的前導(dǎo)字符當(dāng)作十六進(jìn)制數(shù)字的字符串(一個(gè)可選的符號(hào)和一個(gè)可選的 0x),并返回相對(duì)應(yīng)的數(shù)字。如果錯(cuò)誤則返回零。
36str.include? other_str [or] str.include? fixnum
如果 str 包含給定的字符串或字符,則返回 true。
37str.index(substring [, offset]) [or]
str.index(fixnum [, offset]) [or]
str.index(regexp [, offset])

返回給定子字符串、字符(fixnum)或模式(regexp)在 str 中第一次出現(xiàn)的索引。如果未找到則返回 nil。如果提供了第二個(gè)參數(shù),則指定在字符串中開(kāi)始搜索的位置。
38str.insert(index, other_str)
在給定索引的字符前插入 other_str,修改 str。負(fù)值索引從字符串的末尾開(kāi)始計(jì)數(shù),并在給定字符后插入。其意圖是在給定的索引處開(kāi)始插入一個(gè)字符串。
39str.inspect
返回 str 的可打印版本,帶有轉(zhuǎn)義的特殊字符。
40str.intern [or] str.to_sym
返回與 str 相對(duì)應(yīng)的符號(hào),如果之前不存在,則創(chuàng)建符號(hào)。
41str.length
返回 str 的長(zhǎng)度。把它與 size 進(jìn)行比較。
42str.ljust(integer, padstr=' ')
如果 integer 大于 str 的長(zhǎng)度,則返回長(zhǎng)度為 integer 的新字符串,新字符串以 str 左對(duì)齊,并以 padstr 作為填充。否則,返回 str。
43str.lstrip
返回 str 的副本,移除了前導(dǎo)的空格。
44str.lstrip!
從 str 中移除前導(dǎo)的空格,如果沒(méi)有變化則返回 nil。
45str.match(pattern)
如果 pattern 不是正則表達(dá)式,則把 pattern 轉(zhuǎn)換為正則表達(dá)式 Regexp,然后在 str 上調(diào)用它的匹配方法。
46str.oct
把 str 的前導(dǎo)字符當(dāng)作十進(jìn)制數(shù)字的字符串(一個(gè)可選的符號(hào)),并返回相對(duì)應(yīng)的數(shù)字。如果轉(zhuǎn)換失敗,則返回 0。
47str.replace(other_str)
把 str 中的內(nèi)容替換為 other_str 中的相對(duì)應(yīng)的值。
48str.reverse
返回一個(gè)新字符串,新字符串是 str 的倒序。
49str.reverse!
逆轉(zhuǎn) str,str 會(huì)發(fā)生變化并返回。
50str.rindex(substring [, fixnum]) [or]
str.rindex(fixnum [, fixnum]) [or]
str.rindex(regexp [, fixnum])

返回給定子字符串、字符(fixnum)或模式(regexp)在 str 中最后一次出現(xiàn)的索引。如果未找到則返回 nil。如果提供了第二個(gè)參數(shù),則指定在字符串中結(jié)束搜索的位置。超出該點(diǎn)的字符將不被考慮。
51str.rjust(integer, padstr=' ')
如果 integer 大于 str 的長(zhǎng)度,則返回長(zhǎng)度為 integer 的新字符串,新字符串以 str 右對(duì)齊,并以 padstr 作為填充。否則,返回 str。
52str.rstrip
返回 str 的副本,移除了尾隨的空格。
53str.rstrip!
從 str 中移除尾隨的空格,如果沒(méi)有變化則返回 nil。
54str.scan(pattern) [or]
str.scan(pattern) { |match, ...| block }

兩種形式匹配 pattern(可以是一個(gè)正則表達(dá)式 Regexp 或一個(gè)字符串 String)遍歷 str。針對(duì)每個(gè)匹配,會(huì)生成一個(gè)結(jié)果,結(jié)果會(huì)添加到結(jié)果數(shù)組中或傳遞給 block。如果 pattern 不包含分組,則每個(gè)獨(dú)立的結(jié)果由匹配的字符串、$& 組成。如果 pattern 包含分組,每個(gè)獨(dú)立的結(jié)果是一個(gè)包含每個(gè)分組入口的數(shù)組。
55str.slice(fixnum) [or] str.slice(fixnum, fixnum) [or]
str.slice(range) [or] str.slice(regexp) [or]
str.slice(regexp, fixnum) [or] str.slice(other_str)
See str[fixnum], etc.
str.slice!(fixnum) [or] str.slice!(fixnum, fixnum) [or] str.slice!(range) [or] str.slice!(regexp) [or] str.slice!(other_str)

從 str 中刪除指定的部分,并返回刪除的部分。如果值超出范圍,參數(shù)帶有 Fixnum 的形式,將生成一個(gè) IndexError。參數(shù)為 range 的形式,將生成一個(gè) RangeError,參數(shù)為 Regexp 和 String 的形式,將忽略執(zhí)行動(dòng)作。
56str.split(pattern=$;, [limit])

基于分隔符,把 str 分成子字符串,并返回這些子字符串的數(shù)組。

如果 pattern 是一個(gè)字符串 String,那么在分割 str 時(shí),它將作為分隔符使用。如果 pattern 是一個(gè)單一的空格,那么 str 是基于空格進(jìn)行分割,會(huì)忽略前導(dǎo)空格和連續(xù)空格字符。

如果 pattern  是一個(gè)正則表達(dá)式 Regexp,則 str 在 pattern 匹配的地方被分割。當(dāng) pattern 匹配一個(gè)零長(zhǎng)度的字符串時(shí),str 被分割成單個(gè)字符。

如果省略了 pattern 參數(shù),則使用 $; 的值。如果 $; 為 nil(默認(rèn)的),str 基于空格進(jìn)行分割,就像是指定了 ` ` 作為分隔符一樣。

如果省略了 limit 參數(shù),會(huì)抑制尾隨的 null 字段。如果 limit 是一個(gè)正數(shù),則最多返回該數(shù)量的字段(如果 limit 為 1,則返回整個(gè)字符串作為數(shù)組中的唯一入口)。如果 limit 是一個(gè)負(fù)數(shù),則返回的字段數(shù)量不限制,且不抑制尾隨的 null 字段。

57str.squeeze([other_str]*)
使用為 String#count 描述的程序從 other_str 參數(shù)建立一系列字符。返回一個(gè)新的字符串,其中集合中出現(xiàn)的相同的字符會(huì)被替換為單個(gè)字符。如果沒(méi)有給出參數(shù),則所有相同的字符都被替換為單個(gè)字符。
58str.squeeze!([other_str]*)
與 squeeze 相同,但是 str 會(huì)發(fā)生變化并返回,如果沒(méi)有變化則返回 nil。
59str.strip
返回 str 的副本,移除了前導(dǎo)的空格和尾隨的空格。
60str.strip!
從 str 中移除前導(dǎo)的空格和尾隨的空格,如果沒(méi)有變化則返回 nil。
61str.sub(pattern, replacement) [or]
str.sub(pattern) { |match| block }

返回 str 的副本,pattern 的第一次出現(xiàn)會(huì)被替換為 replacement 或 block 的值。pattern 通常是一個(gè)正則表達(dá)式 Regexp;如果是一個(gè)字符串 String,則沒(méi)有正則表達(dá)式元字符被解釋。
62str.sub!(pattern, replacement) [or]
str.sub!(pattern) { |match| block }

執(zhí)行 String#sub 替換,并返回 str,如果沒(méi)有替換執(zhí)行,則返回 nil。
63str.succ [or] str.next
返回 str 的繼承。
64str.succ! [or] str.next!
相當(dāng)于 String#succ,但是 str 會(huì)發(fā)生變化并返回。
65str.sum(n=16)
返回 str 中字符的 n-bit 校驗(yàn)和,其中 n 是可選的 Fixnum 參數(shù),默認(rèn)為 16。結(jié)果是簡(jiǎn)單地把 str 中每個(gè)字符的二進(jìn)制值的總和,以 2n - 1 為模。這不是一個(gè)特別好的校驗(yàn)和。
66str.swapcase
返回 str 的副本,所有的大寫字母轉(zhuǎn)換為小寫字母,所有的小寫字母轉(zhuǎn)換為大寫字母。
67str.swapcase!
相當(dāng)于 String#swapcase,但是 str 會(huì)發(fā)生變化并返回,如果沒(méi)有變化則返回 nil。
68str.to_f
返回把 str 中的前導(dǎo)字符解釋為浮點(diǎn)數(shù)的結(jié)果。超出有效數(shù)字的末尾的多余字符會(huì)被忽略。如果在 str 的開(kāi)頭沒(méi)有有效數(shù)字,則返回 0.0。該方法不會(huì)生成異常。
69str.to_i(base=10)
返回把 str 中的前導(dǎo)字符解釋為整數(shù)基數(shù)(基數(shù)為 2、 8、 10 或 16)的結(jié)果。超出有效數(shù)字的末尾的多余字符會(huì)被忽略。如果在 str 的開(kāi)頭沒(méi)有有效數(shù)字,則返回 0。該方法不會(huì)生成異常。
70str.to_s [or] str.to_str
返回接收的值。
71str.tr(from_str, to_str)
返回 str 的副本,把 from_str 中的字符替換為 to_str 中相對(duì)應(yīng)的字符。如果 to_str 比 from_str 短,那么它會(huì)以最后一個(gè)字符進(jìn)行填充。兩個(gè)字符串都可以使用 c1.c2 符號(hào)表示字符的范圍。如果 from_str 以 ^ 開(kāi)頭,則表示除了所列出的字符以外的所有字符。
72str.tr!(from_str, to_str)
相當(dāng)于 String#tr,但是 str 會(huì)發(fā)生變化并返回,如果沒(méi)有變化則返回 nil。
73str.tr_s(from_str, to_str)
把 str 按照 String#tr 描述的規(guī)則進(jìn)行處理,然后移除會(huì)影響翻譯的重復(fù)字符。
74str.tr_s!(from_str, to_str)
相當(dāng)于 String#tr_s,但是 str 會(huì)發(fā)生變化并返回,如果沒(méi)有變化則返回 nil。
75str.unpack(format)
根據(jù) format 字符串解碼 str(可能包含二進(jìn)制數(shù)據(jù)),返回被提取的每個(gè)值的數(shù)組。format 字符由一系列單字符指令組成。每個(gè)指令后可以跟著一個(gè)數(shù)字,表示重復(fù)該指令的次數(shù)。星號(hào)(*)將使用所有剩余的元素。指令 sSiIlL 每個(gè)后可能都跟著一個(gè)下劃線(_),為指定類型使用底層平臺(tái)的本地尺寸大小,否則使用獨(dú)立于平臺(tái)的一致的尺寸大小。format 字符串中的空格會(huì)被忽略。
76str.upcase
返回 str 的副本,所有的小寫字母會(huì)被替換為大寫字母。操作是環(huán)境不敏感的,只有字符 a 到 z 會(huì)受影響。
77str.upcase!
改變 str 的內(nèi)容為大寫,如果沒(méi)有變化則返回 nil。
78str.upto(other_str) { |s| block }
遍歷連續(xù)值,以 str 開(kāi)始,以 other_str 結(jié)束(包含),輪流傳遞每個(gè)值給 block。String#succ 方法用于生成每個(gè)值。

字符串 unpack 指令

下表列出了方法 String#unpack 的解壓指令。

指令返回描述
AString移除尾隨的 null 和空格。
aString字符串。
BString從每個(gè)字符中提取位(首先是最高有效位)。
bString從每個(gè)字符中提取位(首先是最低有效位)。
CFixnum提取一個(gè)字符作為無(wú)符號(hào)整數(shù)。
cFixnum提取一個(gè)字符作為整數(shù)。
D, dFloat把 sizeof(double) 長(zhǎng)度的字符當(dāng)作原生的 double。
EFloat把 sizeof(double) 長(zhǎng)度的字符當(dāng)作 littleendian 字節(jié)順序的 double。
eFloat把 sizeof(float) 長(zhǎng)度的字符當(dāng)作 littleendian 字節(jié)順序的 float。
F, fFloat把 sizeof(float) 長(zhǎng)度的字符當(dāng)作原生的 float。
GFloat把 sizeof(double) 長(zhǎng)度的字符當(dāng)作 network 字節(jié)順序的 double。
gFloat把 sizeof(float) 長(zhǎng)度的字符當(dāng)作 network 字節(jié)順序的 float。
HString從每個(gè)字符中提取十六進(jìn)制(首先是最高有效位)。
hString從每個(gè)字符中提取十六進(jìn)制(首先是最低有效位)。
IInteger把 sizeof(int) 長(zhǎng)度(通過(guò) _ 修改)的連續(xù)字符當(dāng)作原生的 integer。
iInteger把 sizeof(int) 長(zhǎng)度(通過(guò) _ 修改)的連續(xù)字符當(dāng)作有符號(hào)的原生的 integer。
LInteger把四個(gè)(通過(guò) _ 修改)連續(xù)字符當(dāng)作無(wú)符號(hào)的原生的 long integer。
lInteger把四個(gè)(通過(guò) _ 修改)連續(xù)字符當(dāng)作有符號(hào)的原生的 long integer。
MString引用可打印的。
mStringBase64 編碼。
NInteger把四個(gè)字符當(dāng)作 network 字節(jié)順序的無(wú)符號(hào)的 long。
nFixnum把兩個(gè)字符當(dāng)作 network 字節(jié)順序的無(wú)符號(hào)的 short。
PString把 sizeof(char *) 長(zhǎng)度的字符當(dāng)作指針,并從引用的位置返回 \emph{len} 字符。
pString把 sizeof(char *) 長(zhǎng)度的字符當(dāng)作一個(gè)空結(jié)束字符的指針。
QInteger把八個(gè)字符當(dāng)作無(wú)符號(hào)的 quad word(64 位)。
qInteger把八個(gè)字符當(dāng)作有符號(hào)的 quad word(64 位)。
SFixnum把兩個(gè)(如果使用 _ 則不同)連續(xù)字符當(dāng)作 native 字節(jié)順序的無(wú)符號(hào)的 short。
sFixnum把兩個(gè)(如果使用 _ 則不同)連續(xù)字符當(dāng)作 native 字節(jié)順序的有符號(hào)的 short。
UIntegerUTF-8 字符,作為無(wú)符號(hào)整數(shù)。
uStringUU 編碼。
VFixnum把四個(gè)字符當(dāng)作 little-endian 字節(jié)順序的無(wú)符號(hào)的 long。
vFixnum把兩個(gè)字符當(dāng)作 little-endian 字節(jié)順序的無(wú)符號(hào)的 short。
wIntegerBER 壓縮的整數(shù)。
X 向后跳過(guò)一個(gè)字符。
x 向前跳過(guò)一個(gè)字符。
ZString和 * 一起使用,移除尾隨的 null 直到第一個(gè) null。
@ 跳過(guò) length 參數(shù)給定的偏移量。

在線示例

嘗試下面的示例,解壓各種數(shù)據(jù)。

"abc \0\0abc \0\0".unpack('A6Z6')   #=> ["abc", "abc "]
"abc \0\0".unpack('a3a3')           #=> ["abc", " \000\000"]
"abc \0abc \0".unpack('Z*Z*')       #=> ["abc ", "abc "]
"aa".unpack('b8B8')                 #=> ["10000110", "01100001"]
"aaa".unpack('h2H2c')               #=> ["16", "61", 97]
"\xfe\xff\xfe\xff".unpack('sS')     #=> [-2, 65534]
"now=20is".unpack('M*')             #=> ["now is"]
"whole".unpack('xax2aX2aX1aX2a')    #=> ["h", "e", "l", "l", "o"]
丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清