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

Dav*_*ked 9 string utf-8 julia

Julia的入门指南,Y Minutes中的Learn Julia,不鼓励用户索引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).
Run Code Online (Sandbox Code Playgroud)

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

gol*_*lum 12

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

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

0x62 0xC3 0xB6 0x73 0x65
b    ö         s    e
Run Code Online (Sandbox Code Playgroud)

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

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

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

julia> for c in "böse"
           println(c)
       end
b
ö
s
e
Run Code Online (Sandbox Code Playgroud)

既然你问过,不,UTF8字符串的直接字节索引问题并不是特定于Julia.

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

  • @amrods你可以使用`graphemes`函数:`collect(graphemes("böse"))`返回`["b","ö","s","e"]` (6认同)
  • 你也可以使用`chr2ind`进行迭代,它从字节索引转换为字符索引:`for i in 1:length(s); c = chr2ind(s,i); 的println(S [C]); end`. (2认同)