共享的GAE数据存储区,Go <-> Java,regexp.FindStringIndex索引移位

短版: 打印3,这很有意义,因为Go语言中的字符串基本上是一个字节的片,并且需要三个字节来表示此字符。我如何才能获得len和regexp函数来使用字符而不是字节。


package main

import "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,对吗?


素胚勾勒不出你
浏览 227回答 1
1回答

扬帆大鱼

正如您可能已经了解到的那样,Go和Java对待字符串的方式有所不同。在Java中,字符串是一系列代码点(字符)。在Go中,字符串是一系列字节。Go中的文本操作函数在必要时可以理解UTF-8代码点,但是由于字符串以字节表示,因此它们返回并使用的索引是字节索引,而不是字符索引。正如您在注释中观察到的那样,您可以使用RuneReader和FindReaderIndex获取以字符而不是字节为单位的索引。strings.Reader提供的实现RuneReader,因此您可以使用strings.NewReader将字符串包装到中RuneReader。另一个选择是获取所需的in字符长度的子字符串,然后将其传递给utf8.RuneLen,后者返回UTF-8字符串中的字符数。但是,使用aRuneReader可能更有效。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go