微信公众号: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点击阅读原文可查看历史文章
网友评论