Lua中的字符串能夠包含一個字母也能夠是一整本書。用一個字符串表示100K甚至1M的內容在Lua中並不罕見。 html
在Lua中,字符串是字節的序列。Lua內核中不關心這些字節是什麼編碼格式。Lua只是單純地以8bit爲單位保存它們,且每一個字節能夠是任意數字,包括0。這就意味着咱們能夠用字符串保存任意二進制數據。也能夠將Unicode字符串保存爲任意表示方式(UTF-8,UTF-16等等);可是,下面會談到,儘量使用UTF-8與有不少好處。Lua的標準字符串庫假定了字符最少佔一個字節,這與UTF-8有良好的兼容性。進一步說,從5.3版本開始,Lua內置了一個小的處理UTF-8編碼的庫。git
Lua中的字符串是不可變的(immutable)。不可能單獨修改字符串中的一個字符,像C語言那樣。而是須要建立一個新的字符串,且將它建立爲你想要的樣子:編輯器
1 a = "one string" 2 b = string.gsub(a, "one", "another") -- 修改部分字符 3 print(a) --> one string 4 print(b) --> another string
Lua中的字符串是自動內存管理的對象,與其它Lua對象相同(表、函數等等)。這意味着不須要關心字符串空間的申請和釋放;Lua已經爲咱們處理好了。ide
可使用取長度運算符獲取字符串的長度(寫做「#」)。函數
1 a = "hello" 2 print(#a) --> 5 3 print(#"good bye") --> 8
也能夠用string.len()方法:this
1 a = "hello" 2 print(string.len(a)) --> 5 3 print(string.len("good bye"))--> 8
這兩個結果都是同樣的。編碼
取長度的結果老是以字節數表示,在不一樣的編碼下可能與實際表示的字符數不一樣。lua
能夠經過字符串鏈接運算符「..」(兩個點)來鏈接兩個字符串。若是其中一個操做數是數字,那麼就會將數字轉爲字符串並鏈接:spa
1 "Hello " .. "World" --> Hello World 2 3 "result is " .. 3 --> result is 3
(某些語言使用加號鏈接字符串,可是3+5 和 3..5是不一樣的。)翻譯
記住,Lua中的字符串是不可變對象。鏈接操做老是產生一個新的字符串,而不會修改原有的字符串:
1 a = "Hello" 2 a .. " World" --> Hello World 3 a --> Hello
Literal strings(字符串字面量
使用單引號或雙引號,能夠建立一個字符串,其內容就是引號內的部分:
a = "a line" b = 'another line'
以上兩種寫法徹底等價;惟一的區別是,在單引號表示的字符串內部,能夠放心地使用雙引號而不須要轉義字符;反之也是一樣的。
爲了統一風格,大部分程序編寫者會對同種類的字符串使用一樣的引號,這種字符串的「種類」取決於具體的程序。例如,一個處理XML的程序會爲表示XML字段的字符串使用單引號,由於這些字段內每每會包含雙引號。
Lua中的字符串,支持C風格的轉義字符:
\a |
bell |
\b |
back space |
\f |
form feed |
\n |
newline |
\r |
carriage return |
\t |
horizontal tab |
\v |
vertical tab |
\\ |
backslash |
\" |
double quote |
\' |
single quote |
轉義字符的示例以下:
1 print("one line\nnext line\n\"in quotes\", 'in quotes'") 2 -->one line 3 -->next line 4 -->"in quotes", 'in quotes' 5 6 print('a backslash inside quotes: \'\\\'') 7 -->a backslash inside quotes: '\' 8 9 print("a simpler way: '\\'") 10 -->a simpler way: '\'
(看暈了....
咱們一樣能夠用數字的方式來表示字符串中的一個字符,形式爲\ddd和\xhh,其中ddd三位數字,而hh是兩個16進制數字。
舉一個刻意的例子:字符串」ALO\n123\」」與字符串’\x41LO\10\04923’具備一樣的值,在符合ASCII規範的系統中,0x41(即十進制的65)是字符A的編碼,10是換行符的編碼,而49是數字字符1的編碼(這裏注意必須寫做\049,由於後面跟着的仍是一個數字,會形成歧義,被誤認爲是\492)。
咱們還能夠把以上字符串寫做’\x41\x4c\x4f\x0a\x31\x32\x33\x22’,將每一個字符都用十六進制編碼表示。
(這段翻譯可能有問題,原文以下
We can specify a character in a literal string also by its numeric value through the escape sequences \ddd and \xhh, where ddd is a sequence of up to three decimal digits and hh is a sequence of exactly two hexadecimal digits. As a somewhat artificial example, the two literals "ALO\n123\"" and '\x41LO \10\04923"' have the same value in a system using ASCII: 0x41 (65 in decimal) is the ASCII code for A, 10 is the code for newline, and 49 is the code for the digit 1. (In this example we must write 49 with three digits, as \049, because it is followed by another digit; otherwise Lua would read the escape as \492.) We could also write that same string as '\x41\x4c\x4f\x0a\x31\x32\x33\x22', representing each character by its hexadecimal code.
從Lua 5.3版本開始,還能夠用\u{h...h}的方式指定UTF-8編碼的字符串;在大括號內能夠寫上任意數量的十六進制數字以表示一串字符:
1 "\u{3b1} \u{3b2} \u{3b3}" --> # # #
(以上例子假設是在一個UTF-8終端中執行的。)
咱們還可使用兩個方括號來定義一個字符串,相似多行註釋那樣。
這種方式定義的字符串能夠跨多行且不須要轉義字符。並且若是第一個字符是一個換行符,還會忽略第一個字符。這種定義字符串的方式對於編寫很長的字符串很是方便,舉例以下:
1 page = [[ 2 <html> 3 <head> 4 <title>An HTML Page</title> 5 </head> 6 <body> 7 <a href="http://www.lua.org">Lua</a> 8 </body> 9 </html> 10 ]] 11 io.write(page)
有時候,其它代碼也可能會用到兩個連續的中括號,好比a = b[c[i]](注意結尾是]]),或是去包含已經被多行註釋過的內容時也會有這個問題。要處理這種狀況,只須要在兩個左方括號之間加上任意數量的等號:例如[===[。這樣一來,就必需要用一樣等號數量的方括號來配對:]===],編譯器會忽略掉等號數量不一樣的中括號。經過選擇不一樣數量的等號,就能夠去包含任意一段代碼而不須要對它作出修改。這就解決了中括號衝突問題。
一樣的方法也能夠用於多行註釋。例如若是一個註釋以--[=[開始,那麼就要以]=]結束。這種方法適用於多行註釋發生嵌套的情形。
長字符串很是適用於表示字面字符串的狀況,可是不該當用它來表示非文本類的字符串。
儘管長字符串能夠包含不可打印的二進制字節,可是使用長字符串直接包含二進制數據是不合適的(好比說你的編輯器可能會有顯示問題);甚至,回車符例如「\r\n」會被轉換成「\n」。更好的方式是在表示二進制數據時,使用數字的轉義字符,例如」\x13\x01\xA1\xBB」。可是,在字符串較長時,會致使一行源碼內有一個很是長的字符串。(這裏沒有理解)對於這種狀況,Lua 5.2版本提供了一個轉義字符\z,它會跳過以後的全部空白類字符,直到第一個飛空白字符。以下面的例子:
1 data = "\x00\x01\x02\x03\x04\x05\x06\x07\z 2 \x08\x09\x0A\x0B\x0C\x0D\x0E\x0F"
第一行結尾的\z的做用是,跳過第一行結尾的換行符和第二行開頭的空白字符,直到下一個\x08,也就是說\x08緊接在\x07的後面。這種寫法方便咱們把一個很長的字符串寫在多行裏。