字符串索引错误 (Julia)

0 string julia

我是朱莉娅新手。当我测试该语言时,出现此错误

首先,我将 String 定义b"he§y".

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

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

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

Adr*_*hum 5

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

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

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"
Run Code Online (Sandbox Code Playgroud)

这些 Unicode 字符是显示为转义字符还是显示为特殊字符取决于终端的区域设置及其对 Unicode 的支持。字符串文字使用 UTF-8 编码进行编码。UTF-8 是一种可变宽度编码,这意味着并非所有字符都以相同的字节数进行编码。在 UTF-8 中,ASCII 字符——即那些代码点小于 0x80 (128) 的字符——使用单个字节进行编码,而 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)
Run Code Online (Sandbox Code Playgroud)

  • 此外,在 Julia 1.0 中,您有 `nextind` 和 `prevind` 函数,它们允许您获取作为字符开头的索引。那里有几个选项,所以最好参考 Julia 手册。 (2认同)