美文网首页Julia语言
Julia Unicode 和 UTF-8

Julia Unicode 和 UTF-8

作者: Julia语言 | 来源:发表于2018-09-17 09:40 被阅读55次

    微信公众号:Julia语言
    每周一三五更新Julia语言
    每周二四六更新Python进阶

    Unicode 和 UTF-8

    Julia 完整支持 Unicode 字符和字符串。正如上文所讨论的 ,在字符文本中, Unicode 码位可以由 \u 和 \U来转义,也可以使用标准 C 的转义序列。它们都可以用来写字符串文本:

    julia> s = "\u2200 x \u2203 y"
    "∀ x ∃ y"
    

    非 ASCII 字符串文本使用 UTF-8 编码。 UTF-8 是一种变长编码,意味着并非所有的字符的编码长度都是相同的。在 UTF-8 中,码位低于 0x80 (128) 的字符即 ASCII 字符,编码如在 ASCII 中一样,使用单字节;其余码位的字符使用多字节,每字符最多四字节。这意味着 UTF-8 字符串中,并非所有的字节索引值都是有效的字符索引值。如果索引到无效的字节索引值,会抛出错误:

    julia> s[1]
    '∀': Unicode U+2200 (category Sm: Symbol, math)
    
    julia> s[2]
    ERROR: StringIndexError("∀ x ∃ y", 2)
    [...]
    
    julia> s[3]
    ERROR: StringIndexError("∀ x ∃ y", 3)
    Stacktrace:
    [...]
    
    julia> s[4]
    ' ': ASCII/Unicode U+0020 (category Zs: Separator, space)
    

    上例中,字符 ∀ 为 3 字节字符,所以索引值 2 和 3 是无效的,而下一个字符的索引值为 4。

    使用切片也同样会出现问题。

    julia> s[1:1]
    "∀"
    
    julia> s[1:2]
    ERROR: StringIndexError("∀ x ∃ y", 2)
    Stacktrace:
    [...]
    
    julia> s[1:4]
    "∀ "
    

    由于变长编码,字符串的字符数(由 length(s) 确定)不一定等于字符串的最后索引值。对字符串 s 进行索引,并从 1 遍历至endof(s) ,如果没有抛出异常,返回的字符序列将包括 s 的序列。因而 length(s) <= endof(s) 。下面是个低效率的遍历 s 字符的例子:

    julia> for i = firstindex(s):lastindex(s)
               try
                   println(s[i])
               catch
                   # ignore the index error
               end
           end
    ∀
    
    x
    
    ∃
    
    y
    

    所幸我们可以把字符串作为遍历对象,而不需处理异常:

    julia> for c in s
               println(c)
           end
    ∀
    
    x
    
    ∃
    
    y
    

    Julia 不只支持 UTF-8 ,增加其它编码的支持也很简单。特别是,Julia 还提供了 utf16string 和 utf32string类型,由 utf16(s) 和 utf32(s) 函数分别支持 UTF-16 和 UTF-32 编码。详情可见官方文档。

    欢迎关注微信公众账号Julia语言.jpg

    点击阅读原文可查看历史文章

    相关文章

      网友评论

        本文标题:Julia Unicode 和 UTF-8

        本文链接:https://www.haomeiwen.com/subject/wxorgftx.html