当前位置:K88软件开发文章中心编程语言非主流编程语言Julia → 文章内容

Julia 字符串

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-15 16:28:07

由 陈 创建,youj 最后一次修改 2016-08-12 字符串 Julia 中处理 ASCII 文本简洁高效,也可以处理 Unicode 。使用 C 风格的字符串代码来处理 ASCII 字符串,性能和语义都没问题。如果这种代码遇到非 ASCII 文本,会提示错误,而不是显示乱码。这时,修改代码以兼容非 ASCII 数据也很简单。 关于 Julia 字符串,有一些值得注意的高级特性: String 是个抽象类型,不是具体类型 Julia 的 Char 类型代表单字符,是由 32 位整数表示的 Unicode 码位 与 Java 中一样,字符串不可更改:String 对象的值不能改变。要得到不同的字符串,需要构造新的字符串 概念上,字符串是从索引值映射到字符的部分函数,对某些索引值,如果不是字符,会抛出异常 Julia 支持全部 Unicode 字符: 文本字符通常都是 ASCII 或 UTF-8 的,但也支持其它编码 字符 Char 表示单个字符:它是 32 位整数,值参见 Unicode 码位 。 Char 必须使用单引号:julia> 'x''x'julia> typeof(ans)Char 可以把 Char 转换为对应整数值:julia> int('x')120julia> typeof(ans)Int64 在 32 位架构上, typeof(ans) 的类型为 Int32 。也可以把整数值转换为 Char :julia> char(120)'x' 并非所有的整数值都是有效的 Unicode 码位,但为了性能, char 一般不检查其是否有效。如果你想要确保其有效,使用 is_valid_char 函数:julia> char(0x110000)'\U110000'julia> is_valid_char(0x110000)false 目前,有效的 Unicode 码位为,从 U+00 至 U+d7ff,以及从 U+e000 至 U+10ffff。 可以用单引号包住 \u 及跟着的最多四位十六进制数,或者 \U 及跟着的最多八位(有效的字符,最多需要六位)十六进制数,来输入 Unicode 字符:julia> '\u0''\0'julia> '\u78''x'julia> '\u2200''?'julia> '\U10ffff''\U10ffff' Julia 使用系统默认的区域和语言设置来确定,哪些字符可以被正确显示,哪些需要用 \u 或 \U 的转义来显示。除 Unicode 转义格式之外,所有 C 语言转义的输入格式都能使:julia> int('\0')0julia> int('\t')9julia> int('\n')10julia> int('\e')27julia> int('\x7f')127julia> int('\177')127julia> int('\xff')255 可以对 Char 值比较大小,也可以做少量算术运算:julia> 'A' < 'a'truejulia> 'A' <= 'a' <= 'Z'falsejulia> 'A' <= 'X' <= 'Z'truejulia> 'x' - 'a'23julia> 'A' + 1'B' 字符串基础 字符串文本应放在双引号 "..." 或三个双引号 """...""" 中间:julia> str = "Hello, world.\n""Hello, world.\n"julia> """Contains "quote" characters""""Contains \"quote\" characters" 使用索引从字符串提取字符:julia> str[1]'H'julia> str[6]','julia> str[end]'\n' Julia 中的索引都是从 1 开始的,最后一个元素的索引与字符串长度相同,都是 n 。 在任何索引表达式中,关键词 end 都是最后一个索引值(由 endof(str) 计算得到)的缩写。可以对字符串做 end 算术或其它运算:julia> str[end-1]'.'julia> str[end/2]' 'julia> str[end/3]ERROR: InexactError() in getindex at string.jl:59julia> str[end/4]ERROR: InexactError() in getindex at string.jl:59 索引小于 1 或者大于 end ,会提示错误:julia> str[0]ERROR: BoundsError()julia> str[end+1]ERROR: BoundsError() 使用范围索引来提取子字符串:julia> str[4:9]"lo, wo"str[k] 和 str[k:k] 的结果不同:julia> str[6]','julia> str[6:6]"," 前者是类型为 Char 的单个字符,后者为仅有一个字符的字符串。在 Julia 中这两者完全不同。 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]'?'julia> s[2]ERROR: invalid UTF-8 character index in next at ./utf8.jl:68 in getindex at string.jl:57julia> s[3]ERROR: invalid UTF-8 character index in next at ./utf8.jl:68 in getindex at string.jl:57julia> s[4]' ' 上例中,字符 ? 为 3 字节字符,所以索引值 2 和 3 是无效的,而下一个字符的索引值为 4。 由于变长编码,字符串的字符数(由 length(s) 确定)不一定等于字符串的最后索引值。对字符串 s 进行索引,并从 1 遍历至 endof(s) ,如果没有抛出异常,返回的字符序列将包括 s 的序列。因而 length(s) <= endof(s)。下面是个低效率的遍历 s 字符的例子:julia> for i = 1:endof(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 编码。它还为 UTF-16 或 UTF-32 字符串提供了别名 WString 和 wstring(s),两者的选择取决于 Cwchar_t 大小。有关 UTF-8 的讨论,详见下面的字节数组文本。 内插 字符串连接是最常用的操作:julia> greet = "Hello""Hello"julia> whom = "world""world"julia> string(greet, ", ", whom, ".\n")"Hello, world.\n" 像 Perl 一样, Julia 允许使用 $ 来内插字符串文本:julia> "$greet, $whom.\n""Hello, world.\n" 系统会将其重写为字符串文本连接。 $ 将其后的最短的完整表达式内插进字符串。可以使用小括号将任意表达式内插:julia> "1 + 2 = $(1 + 2)""1 + 2 = 3" 字符串连接

[1] [2] [3]  下一页


Julia 字符串