字符串是字符的有限序列。当然,真正的麻烦来自于人们问一个角色是什么。英语演讲熟悉的字符是字母A
,B
,C
等,用数字和常用标点符号在一起。这些字符通过ASCII标准进行了标准化,并映射到0到127之间的整数值。当然,还有许多其他非英语语言使用的字符,包括带有重音和其他修饰的ASCII字符变体,相关的脚本(例如西里尔字母和希腊语)以及与ASCII和英语完全无关的脚本,包括阿拉伯语,中文,希伯来语,北印度语,日语和韩语。该统一标准解决了一个字符的复杂性,通常被认为是解决该问题的权威标准。根据您的需要,您可以完全忽略这些复杂性,而假装仅存在ASCII字符,或者可以编写可以处理任何字符或处理非ASCII文本时可能遇到的编码的代码。Julia使处理普通ASCII文本简单而有效,而处理Unicode则尽可能简单而高效。特别是,您可以编写C样式的字符串代码来处理ASCII字符串,并且它们在性能和语义方面都将按预期工作。如果此类代码遇到非ASCII文本,它将以明确的错误消息正常地失败,而不是默默地引入损坏的结果。当这个情况发生时,
有关Julia的字符串,有一些值得注意的高级功能:
- Julia中用于字符串(和字符串文字)的内置具体类型为
String
。这通过UTF-8编码支持所有Unicode字符。(提供了与其他Unicode编码之间进行转换的功能。)transcode()
- 所有字符串类型都是抽象类型的子类型
AbstractString
,外部包定义了其他AbstractString
子类型(例如,用于其他编码)。如果定义的函数需要字符串参数,则应将类型声明为AbstractString
,以便接受任何字符串类型。 - 像C和Java一样,但与大多数动态语言不同,Julia具有代表一个字符的一流类型,称为
Char
。这只是一种特殊的32位原始类型,其数字值表示Unicode代码点。 - 与Java中一样,字符串是不可变的:
AbstractString
对象的值无法更改。要构造一个不同的字符串值,请从其他字符串的一部分构造一个新的字符串。 - 从概念上讲,字符串是从索引到字符的部分函数:对于某些索引值,不返回任何字符值,而是引发异常。这允许通过编码表示形式的字节索引而不是字符索引有效地索引字符串,而这对于Unicode字符串的可变宽度编码既不能有效实现,也不能简单地实现。
性格
甲Char
值代表单个字符:它仅仅是一个32位的原始类型用特殊文字表示和适当的算术行为,其数值被解释为Unicode代码点。下面是Char
值输入并显示:
julia> 'x'
'x': ASCII/Unicode U 0078 (category Ll: Letter, lowercase)
julia> typeof(ans)
Char
您可以Char
轻松地将a转换为其整数值,即代码点:
julia> Int('x')
120
julia> typeof(ans)
Int64
在32位架构上,typeof(ans)
将为Int32
。您可以Char
轻松地将整数值转换回a :
julia> Char(120)
'x': ASCII/Unicode U 0078 (category Ll: Letter, lowercase)
并非所有整数值都是有效的Unicode代码点,但是为了提高性能,Char()
转换并不会检查每个字符值是否有效。如果要检查每个转换后的值是否是有效的代码点,请使用以下isvalid()
函数:
julia> Char(0x110000)
'U110000': Unicode U 110000 (category Cn: Other, not assigned)
julia> isvalid(Char, 0x110000)
false
截至发稿时,有效的Unicode代码点是U 00
通过U d7ff
和U e000
通过U 10ffff
。这些还没有全部被赋予可理解的含义,也没有必要由应用程序解释,但是所有这些值都被认为是有效的Unicode字符。
您可以使用单引号将任何Unicode字符输入u
,最多使用四个十六进制数字或U
最多八个十六进制数字(最长有效值仅需要六个):
julia> 'u0'
'