为什么朱莉娅不鼓励对UTF8字符串进行索引?

时间:2016-02-02 16:24:10

标签: string utf-8 julia

Julia的介绍性指南Learn Julia in Y Minutes阻止用户索引UTF8字符串:

# Some strings can be indexed like an array of characters
"This is a string"[1] # => 'T' # Julia indexes from 1
# However, this is will not work well for UTF8 strings,
# so iterating over strings is recommended (map, for loops, etc).

为什么不鼓励迭代这些字符串?具体关于这种备用字符串类型的结构会使索引错误?这是Julia特定的陷阱,还是扩展到所有支持UTF8字符串的语言?

2 个答案:

答案 0 :(得分:12)

因为在UTF8中,字符并不总是以单个字节编码。

以德语字符串böse(邪恶)为例。 UTF8编码中此字符串的字节为:

0x62 0xC3 0xB6 0x73 0x65
b    ö         s    e

正如您所见,变音符ö需要2个字节。

现在,如果你直接索引这个UTF8编码的字符串"böse"[4]将会给你s而不是e

但是,您可以在julia中将字符串用作可迭代对象:

julia> for c in "böse"
           println(c)
       end
b
ö
s
e

自从你问过,不,UTF8字符串的直接字节索引问题并不是特定于Julia。

进一步阅读的建议:
http://docs.julialang.org/en/release-0.4/manual/strings/#unicode-and-utf-8

答案 1 :(得分:1)

只是为了扩展Scott Jones的评论,Julia实际上还提供了与C ++中的std::wstring类似的固定宽度的字符串,从而可以方便地建立索引。它们现在位于https://github.com/JuliaStrings/LegacyStrings.jl中,需要先使用Pkg.add("LegacyStrings")安装软件包。

UTF32String是大多数用例的最佳选择。要从普通字符串构造UTF32String,请执行以下操作:s2 = utf32(s)