我有一个中文字符串:
x = "你好"
我想遍历它,并对其中的每个角色执行一些操作,例如:
for i, len := 0, len(x); i < len; i++ {
foo( x[i] ) // do sth.
}
我发现len(x)
将返回6
而不是2
,在Google之后我找到了返回字符串实际长度的方法RuneCountInString
,但我仍然不知道如何循环以使x[i]
获得正确的字符,例如x[0] == '你'
.
谢谢
我有一个中文字符串:
x = "你好"
我想遍历它,并对其中的每个角色执行一些操作,例如:
for i, len := 0, len(x); i < len; i++ {
foo( x[i] ) // do sth.
}
我发现len(x)
将返回6
而不是2
,在Google之后我找到了返回字符串实际长度的方法RuneCountInString
,但我仍然不知道如何循环以使x[i]
获得正确的字符,例如x[0] == '你'
.
谢谢
使用range
.
x = "你好"
for _, c := range x {
// do something with c
}
如果想要随机访问,则需要使用代码单元索引,而不是字符索引.幸运的是,没有充分的理由需要字符索引,所以代码单元索引就可以了.
大多数语言都有完全相同的问题.例如,Java和C#使用UTF-16,这也是一种可变长度编码(但有些人假装它不是).
有关Go为什么使用UTF-8的更多信息,请参阅UTF-8 Manifesto.