字符串索引错误(Julia)

问题描述 投票:0回答:2

我是朱莉娅新手。当我测试该语言时,我得到了this error

首先,我将 String

b
定义为
"he§y"

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

当我尝试获取

b
的第三个字符(应该是“§”)时,一切正常

但是,当我尝试获取

b
的第四个字符(应该是“y”)时,会抛出“StringIndexError”。

string julia
2个回答
6
投票

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

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

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)
    

0
投票
'§'字符占用2个字节。因此索引 s[4] 被跳过,下一个索引是 s[5]

“he§y”的字符在内存中的排列如下 s[1]:h s[2]:e s[3]s[4]:§(索引 3 和 4 像超级 3 一样组合在一起,因此没有第 4 个索引。 s[5]: y

© www.soinside.com 2019 - 2024. All rights reserved.