julia-Char字符String字符串(第7講)

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."

========================================================================================

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章