字符串索引错误(朱莉娅)

时间:2018-08-23 02:04:17

标签: string julia

我是Julia的新手。在测试语言时,我得到了this error

首先,我将字符串b定义为"he§y"

当我在字符串中有“特殊”字符时,朱莉娅表现得很奇怪。

当我尝试获取b的第三个字符(应该是'§')时,一切正常

但是,当我尝试获取b的第四个字符(应该是'y')时,会抛出“ StringIndexError”。

1 个答案:

答案 0 :(得分:4)

我不相信编译器会抛出错误。您的意思是运行时错误吗?

我对朱利安语言一无所知,但症状似乎与字符串索引有关,并不是基于代码点,而是基于某种编码。

Julia lang的文档似乎支持了我的假设:

https://docs.julialang.org/en/stable/manual/strings/

  

在Julia中用于字符串(和字符串文字)的内置具体类型为String。这通过 UTF-8编码支持所有Unicode字符。 (提供了转码功能,可以与其他Unicode编码进行相互转换。)

...

  

从概念上讲,字符串是从索引到字符的部分函数:对于某些索引值,不返回任何字符值,而是引发异常。这样可以通过编码表示形式的字节索引有效地索引到字符串中,而不是通过字符索引来有效地进行索引,而字符索引既不能有效地实现,也不能简单地用于Unicode字符串的可变宽度编码。


编辑:摘自Julia文档,该示例演示了您所面临的确切“问题”。

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

这些Unicode字符是显示为转义符还是显示为   特殊字符取决于终端的语言环境设置及其   支持Unicode。字符串文字使用UTF-8编码   编码。 UTF-8是可变宽度编码,这意味着并非所有   字符以相同的字节数编码。在UTF-8中,ASCII   字符-即代码点小于0x80(128)的字符-   使用单个字节以ASCII形式进行编码,而代码点   0x80及更高版本使用多个字节进行编码-每个字节最多四个   字符。这意味着并不是每个到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)