短版: 打印3,这很有意义,因为Go语言中的字符串基本上是一个字节的片,并且需要三个字节来表示此字符。我如何才能获得len和regexp函数来使用字符而不是字节。package mainimport "fmt"func main() { fmt.Println(len("ウ"))//returns 3 fmt.Println(utf8.RuneCountInString("ウ"))//returns 1}背景:我正在使用JDO(Java)将文本保存到GAE数据存储中。然后,我使用Go处理文本,特别是使用regexp.FindStringIndex并将索引保存到数据存储中。然后回到Java领域,我发送未修改的文本,并通过json索引到GWT客户端。索引在“移动”过程中的某个位置,因此当它在客户端上时,它们已关闭。看来问题与字符编码有关,我假设Java / Go解释文本(索引)的方式与utf-8 char / byte不同?我在regexp包中看到了对符文的引用。我想我可以使regexp.FindStringIndex返回go中的字节索引,或者使GWT客户端了解utf-8索引。有什么建议么?如果将来需要国际化该应用程序,我应该使用UTF-8,对吗?
1 回答
扬帆大鱼
TA贡献1799条经验 获得超9个赞
正如您可能已经了解到的那样,Go和Java对待字符串的方式有所不同。在Java中,字符串是一系列代码点(字符)。在Go中,字符串是一系列字节。Go中的文本操作函数在必要时可以理解UTF-8代码点,但是由于字符串以字节表示,因此它们返回并使用的索引是字节索引,而不是字符索引。
正如您在注释中观察到的那样,您可以使用RuneReader
和FindReaderIndex
获取以字符而不是字节为单位的索引。strings.Reader提供的实现RuneReader
,因此您可以使用strings.NewReader
将字符串包装到中RuneReader
。
另一个选择是获取所需的in字符长度的子字符串,然后将其传递给utf8.RuneLen,后者返回UTF-8字符串中的字符数。但是,使用aRuneReader
可能更有效。
- 1 回答
- 0 关注
- 226 浏览
添加回答
举报
0/150
提交
取消