短版: 打印3,這很有意義,因?yàn)镚o語(yǔ)言中的字符串基本上是一個(gè)字節(jié)的片,并且需要三個(gè)字節(jié)來(lái)表示此字符。我如何才能獲得len和regexp函數(shù)來(lái)使用字符而不是字節(jié)。package mainimport "fmt"func main() { fmt.Println(len("ウ"))//returns 3 fmt.Println(utf8.RuneCountInString("ウ"))//returns 1}背景:我正在使用JDO(Java)將文本保存到GAE數(shù)據(jù)存儲(chǔ)中。然后,我使用Go處理文本,特別是使用regexp.FindStringIndex并將索引保存到數(shù)據(jù)存儲(chǔ)中。然后回到Java領(lǐng)域,我發(fā)送未修改的文本,并通過(guò)json索引到GWT客戶端。索引在“移動(dòng)”過(guò)程中的某個(gè)位置,因此當(dāng)它在客戶端上時(shí),它們已關(guān)閉??磥?lái)問(wèn)題與字符編碼有關(guān),我假設(shè)Java / Go解釋文本(索引)的方式與utf-8 char / byte不同?我在regexp包中看到了對(duì)符文的引用。我想我可以使regexp.FindStringIndex返回go中的字節(jié)索引,或者使GWT客戶端了解utf-8索引。有什么建議么?如果將來(lái)需要國(guó)際化該應(yīng)用程序,我應(yīng)該使用UTF-8,對(duì)嗎?
1 回答

揚(yáng)帆大魚(yú)
TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超9個(gè)贊
正如您可能已經(jīng)了解到的那樣,Go和Java對(duì)待字符串的方式有所不同。在Java中,字符串是一系列代碼點(diǎn)(字符)。在Go中,字符串是一系列字節(jié)。Go中的文本操作函數(shù)在必要時(shí)可以理解UTF-8代碼點(diǎn),但是由于字符串以字節(jié)表示,因此它們返回并使用的索引是字節(jié)索引,而不是字符索引。
正如您在注釋中觀察到的那樣,您可以使用RuneReader
和FindReaderIndex
獲取以字符而不是字節(jié)為單位的索引。strings.Reader提供的實(shí)現(xiàn)RuneReader
,因此您可以使用strings.NewReader
將字符串包裝到中RuneReader
。
另一個(gè)選擇是獲取所需的in字符長(zhǎng)度的子字符串,然后將其傳遞給utf8.RuneLen,后者返回UTF-8字符串中的字符數(shù)。但是,使用aRuneReader
可能更有效。
- 1 回答
- 0 關(guān)注
- 259 瀏覽
添加回答
舉報(bào)
0/150
提交
取消