本文同步發表於個人網站
與Python相同,字串是不可變得。但Lua字串於內部表示時,完全採用8-bits表示,包含0(\0
)。這也是為什麼在基礎1: 變數一篇,會特別說明\u{1F603}
的使用。
所以字串如果取其長度,可能和你想像的不一樣:
-- note: with UTF-8
print(string.len("我")) -- equal print(#"我") => 3
不過Lua是認得UTF-8的,其本身可以協助不支援UTF-8的程式語言(ex: C語言)。
-- note: with UTF-8
print(utf8.len("我")) -- => 1
C90包含<wchar.h>; C11有<uchar.h>。
儘管如此,不表示就是UTF-8寬字元(Wide character) 是電腦抽象術語(沒有規定具體實現細節),表示比8位元字元還寬的資料類型。不同於Unicode。 -- 維基百科
因為Lua認得UTF-8,所以其原始碼最好以UTF-8儲存,否則可能執行會與想像不同。
要表示字串在Lua有多種方式。
與Python、JS相同,使用單引號或雙引號包起來:
s1 = 'string'
s2 = "string"
類似於Python使用r""""""""
,Lua使用[[]]
來處理多行字串:
s3 = [[
multiple
string
]]
其實是可以配對的,可以在[[
和]]
加入任意相同數量的=
:
s4 = [======[[=]]======] -- => "[=]"
string
函式庫裡有format
方法,類似於C語言的printf()
或是Python的str.format()
。
local string = require "string"
string.format("string")
Lua可以使用#
操作取得序列長度:
print(#"abc") -- => 3
也可以是用string.len()
print(string.len("abc")) -- => 3
不過如同前面所說,其計算是以8-bits為單位,結果可能與你想像不同。
如果你的字串恰好是UTF-8,可以使用utf8
函式庫:
local utf8 = require "utf8"
print(utf8.len("你好,世界!")) -- => 6
可以使用..
操作連接兩個字串:
print("Hello, " .. "World")
這很像PHP使用.
來連接字串。
Lua本身提供string和utf8兩個函式庫可以處理字串。未來有使用到的會在特別說明。