2013-10-17 35 views
10

我在閱讀具有固定列長度格式的文件時遇到了一些麻煩。一些列可能包含變音符號。變音和切片

變音器似乎使用2個字節而不是1個。這不是我期待的行爲。有什麼樣的函數返回一個子字符串?切片在這種情況下似乎不起作用。

下面是一些示例代碼:

http://play.golang.org/p/ZJ1axy7UXe

umlautsString := "Rhön" 
fmt.Println(len(umlautsString)) 
fmt.Println(umlautsString[0:4]) 

打印:

5 
Rhö 

回答

12

在旅途中,字符串的切片字節數爲單位,不runes。這就是爲什麼"Rhön"[0:3]會給你Rhö的第一個字節。

以UTF-8編碼的字符表示爲符文,因爲UTF-8編碼多於一個的字符(最多四個字節)以提供更大範圍的字符。

如果要使用[]語法對字符串進行分片,請先將字符串轉換爲[]rune。 實施例(on play):

umlautsString := "Rhön" 
runes = []rune(umlautsString) 
fmt.Println(string(runes[0:3])) // Rhö 

值得注意:This golang blog post about string representation in go

+0

感謝您的回答。我沒有意識到可以轉換爲'[]符文 - 這將允許我清理一些最近的代碼。 –

+0

「UTF-8字符編碼爲符文」毫無意義。你能否澄清,重寫或刪除它? – rightfold

+0

@rightfold你很粗魯。它至少對另外9個人有意義,所以刪除答案是毫無疑問的。你可能已經很好地要求澄清,但在這種情況下,你似乎懶得跟隨nemo發佈的任何一個鏈接,這兩個鏈接都詳細解釋了什麼是符文。 – fresskoma

3

您可以轉換string[]rune,並與它的工作:

package main 

import "fmt" 

func main() { 
    umlautsString := "Rhön" 

    fmt.Println(len(umlautsString)) 

    subStrRunes:= []rune(umlautsString) 

    fmt.Println(len(subStrRunes)) 

    fmt.Println(string(subStrRunes[0:4])) 
} 

http://play.golang.org/p/__WfitzMOJ

希望幫助!