短版: 打印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 關注
- 257 瀏覽
添加回答
舉報
0/150
提交
取消