星期二的问题(外语字符串索引)

Bil*_*ill 2 unicode julia

这是一个可能是土耳其方言的星期二可能拼写错误的单词: "Çkinci gÜn".拼写与问题无关.我的问题是这个问题:

s =  "Çkinci"
srev = reverse(s)
for i in 1:length(srev)
    println(srev[i])
end
Run Code Online (Sandbox Code Playgroud)

有效,但是

for i in 1:length(s)
    println(s[i])
end
Run Code Online (Sandbox Code Playgroud)

第二封信上的错误.事实上,Çkinci,但不是它的反向弦,不能在位置2的字母k处索引.

有谁知道为什么?"Çk"是一个Unicode转义序列还是什么?

Bog*_*ski 5

Julia使用UTF-8字符串编码.实际上字符'Ç'需要2个字节.所以你应该写:

julia> for v in s
           println(v)
       end
Ç
k
i
n
c
i
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读有关字符串索引的详细信息:https://docs.julialang.org/en/latest/manual/strings/#Unicode-and-UTF-8-1.

为什么原因reverse版本的工作是人物k,i,n,c,i都是ASCII等你,你已经完成,并通过事故发生前没打多字节字符只需要1个字节length(返回数个字符的字符串)等于到6,其位置Çreverse(s).但是,实际上你的字符串需要7个字节,你可以通过调用来检查:

julia> ncodeunits(s)
7

julia> sizeof(s)
7

julia> length(s)
6
Run Code Online (Sandbox Code Playgroud)

编辑: 在Julia字符串中,在调用getindex它们时使用字节索引而不是字符索引.这是出于性能原因,因为在UTF-8中,罚款第n个字符索引的成本是O(n).

如果要i在字符串s写入中获取-th字符的字节索引nextind(s, 0, i).例如,s[nextind(s, 0, i)]将返回i字符串中的第 - 个字符s.请注意,只有在想要从字符串中获取一个字符时才应使用它.如果你需要很多,那么在字符串上使用迭代会更有效.

  • 如果你需要字符索引,而不是字节索引(由`nextind` /`prevind`返回),只需在enumerate(s)中写'for(i,c)来获取索引和字符. (4认同)
  • 如果您的问题需要索引使用`nextind`或`prevind`函数来获取字符串中的连续有效索引. (2认同)