Char字符String字符串 2020/5/31
==================================================================================
1.1.Char:
# Char 代表單字符,由32位整數表示 Unicode 碼位;必須使用單引號
# 子類型AbstractChar是32位原始類型可表示任何Unicode字符(並且基於UTF-8編碼)
1.2.構造字符:
'x',Char(120),Char('x') #ASCII構造:('x', 'x', 'x')
# 用系統默認區域和語言設置來確定哪些字符可被顯示,哪些需用 \u 或 \U 轉義來顯示
'中' # '中': Unicode U+4E2D (category Lo: Letter, other)
'\u78', '\u2200' # Unicode 碼構造: ('x', '∀') 最多4位十六進制數
'\U000078','\U002200' # Unicode 碼構造: ('x', '∀') 最多6位十六進制數
===================================================================================
1.3.Char 轉整數值:
int('x') # 120
Int('\0'),Int('\t'),Int('\n'),Int('\e'),Int('\x7f'),Int('\177')# C 轉義字符:(0, 9, 10, 27, 127, 127)
===================================================================================
1.4.Char運算:
'A' < 'a'<'z' # Char 值比較大小:true
'x' - 1,'x' - 'a', 'A' + 1 # Char值加減運算:('w', 23, 'B')
Char(0x110000),isvalid(Char, 0x110000)# 檢測字符是否有效:('\U110000', false)
===================================================================================
2.字符串
2.1.String
# 字符串類型String不可更改;支持 ASCII 全部Unicode(通常 UTF-8也支持其它編碼)
# 如定義函數需字符串參數應將類型聲明爲AbstractString以便接受任何字符串類型
# 字符串是從索引值映射到字符的部分函數,對某些索引值,如果不是字符,會拋出異常
# string抽象非具體類型
2.1.定義:字符串應用雙引號 "..." 或三雙引號 """..."""
2.2.構造:
"Hello, world.\n","""Hello, world.\n"""#("Hello, world.\n", "Hello, world.\n")
2.3.索引:
str="Hello, world.\n" # Julia 索引整數[1 , n ];<1 或>end 錯誤
str[6],str[6:6] # (',', ",")
str[0],str[end+1] # 都錯誤
str[firstindex(str)]==str[begin],str[lastindex(str)]==str[end] # str首尾索引:(true, true)
str[begin*2],str[begin+1],str[end-1] ,str[end÷2] ,str[div(end,2)] # 字符串運算:('e', 'e', '.', ' ', ' ')
str[begin],str[6],str[end],str[4:9] # 提取字符:('H', ',', '\n', "lo, wo")
=====================================================================================
2.4.字符串操作
2.4.1字符串連接:
str1 ,str2= "Hello","Hello"
string(str1, ", ", str2, ".\n"),str1 * ", " * str2 * ".\n" # ("Hello, Hello.\n", "Hello, Hello.\n")
2.4.2.內插:文本表達式字符數組
c,name,age,arr='!',"Tom",(1+20),[1,2,3]
"Name=$name;age=$age $c arr=$arr\n" # "Name=Tom;age=21 ! arr=[1, 2, 3]\n"必須全是字符串
String("Name=$name;age=$age $c arr=$arr\n") # "Name=Tom;age=21 ! arr=[1, 2, 3]\n"必須全是字符串
string("Name=$name;age=$age $c"," arr=",arr,"\n") # "Name=Tom;age=21 ! arr=[1, 2, 3]\n"類似python print格式
print(" \$100 \n") # $100 \$轉義
2.4.3.字符串比較:<,>,==,!=
"1 + 2 = 3" == "1 + 2 = $(1 + 2)" # 字符串比較:true
2.4.4.字符的索引值:
str="xylophone"
search("xylophone", 'x') #查找字符索引:1,找不到返回0
search("xylophone", 'o', 5)#從此偏移值開始查找:7
findfirst(isequal('o'),str),findlast(isequal('o'), str) #首尾索引:(4, 7)
findnext(isequal('o'), str, 1),findnext(isequal('o'), str, 5)#指定偏移:(4, 7)
findprev(isequal('o'), str, 5)#指定偏移:4
SubString(str, 1, 4) # 取子串
occursin("phone", str),occursin('o', str)# 是否存在子串:(true, true)
repeat("x1:", 2) # 重複字符串次數:"x1:x1:"
join(["x1,", "x3"], ", ","x2,") # "x1,x2,x3"
2.4.5.其他函數:
length(str) str中的字符數str。
length(str, i, j) str從i到的有效字符索引數j
ncodeunits(str) 字符串中的代碼單元數
codeunit(str, i) str在index處的字符串中給出代碼單位值i。
thisind(str, i) 給定任意索引到字符串中,找到索引指向的字符的第一個索引。
nextind(str, i, n=1) n在index之後找到第一個字符的開頭i。
prevind(str, i, n=1) n在索引index之前找到第一個字符的開頭i
=====================================================================================
3.備註:
3.1.Unicode 和 UTF-8
# 非 ASCII 字符串用 UTF-8 編碼(變長編碼;<0x80 (128) 字符 ASCII 用單字節)支持 UTF-16 和 UTF-32 編碼;
# 其餘碼位字符用多字節(max四字節)並非所有字節索引值都有效;無效字節索引值拋錯誤
實例1:獲取字符串的有效索引
s = "\u2200 x \u2203 y" # "∀ x ∃ y"
length(s) #7
s[2],s[3] #錯誤:無效字節索引
for i = firstindex(s):lastindex(s)
try println(s[i]) catch ; end
end
for c in s println(c) end
show([s[i] for i in eachindex(s)]) # ['∀', ' ', 'x', ' ', '∃', ' ', 'y']
show(collect(eachindex(s))) # [1, 4, 5, 6, 7, 10, 11]
function get_str(s)
a=[i==1 ? 1 : nextind(s,i) for i in 1:length(s)]# nextind,prevind遞增/減到下/上一個有效索引
set=Set(a);a=[v for v in set];sort!(a) # ['∀', ' ', 'x', ' ', '∃', ' ']
show([s[i] for i in a])
end
3.2.實例2:字符串連接問題
a, b = "\xe2\x88", "\x80"
c = a*b # "∀" 無效UTF-8str串聯:str可能與輸入str不同且字符數可能少於串聯字符串的字符數之和
collect.([a, b, c])
# 3-element Array{Array{Char,1},1}:
# ['\xe2\x88']
# ['\x80']
# ['∀']
========================================================================================
3.3.三重引用的字符串文字
# 三引號("""...""")創建字符串對創建更長的文本塊很有用。
字符串文字可包含"不帶轉義符符號。
注意:
\n即使編輯器用回車\r(CR)或CRLF組合作爲結束行,文字字符串換行符(無論是單引號還是三引號)
都會在字符串中產生換行符(LF)。
要在字符串中包含CR,請使用顯式轉義\r; 如輸入文字字符串"a CRLF line ending\r\n"
實例1:
str = """
Hello,
world.
"""
# " Hello,\n world.\n"
實例2:
""" This
is
a test"""
# " This\nis\n a test" 僅僅保留This前的空格
實例3.1:
"""hello"""
# "hello"
實例3.2.:
"""
hello"""
# "hello" 等價上面
實例4:
"""
hello"""
# "\nhello"開頭將包含文字換行符
實例5:
"""
Hello,
world."""
# "Hello,\nworld."
========================================================================================