为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
素胚勾勒不出你 2021-04-29 14:57:54
短版: 打印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代码点,但是由于字符串以字节表示,因此它们返回并使用的索引是字节索引,而不是字符索引。

正如您在注释中观察到的那样,您可以使用RuneReaderFindReaderIndex获取以字符而不是字节为单位的索引。strings.Reader提供的实现RuneReader,因此您可以使用strings.NewReader将字符串包装到中RuneReader

另一个选择是获取所需的in字符长度的子字符串,然后将其传递给utf8.RuneLen,后者返回UTF-8字符串中的字符数。但是,使用aRuneReader可能更有效。


查看完整回答
反对 回复 2021-05-10
  • 1 回答
  • 0 关注
  • 226 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信