假設我有一個這樣的文本文件。轉換Unicode字符代碼指向文字字符
\u0053
\u0075
\u006E
有沒有辦法將其轉換爲此?
S
u
n
目前,我使用ioutil.ReadFile("data.txt")
,但是當我打印的數據,我得到的Unicode代碼點,而不是字符串文字。我意識到這是ReadFile
的正確行爲,它只是不想要我想要的。
我的目標是用它們的文字字符替換代碼點。
假設我有一個這樣的文本文件。轉換Unicode字符代碼指向文字字符
\u0053
\u0075
\u006E
有沒有辦法將其轉換爲此?
S
u
n
目前,我使用ioutil.ReadFile("data.txt")
,但是當我打印的數據,我得到的Unicode代碼點,而不是字符串文字。我意識到這是ReadFile
的正確行爲,它只是不想要我想要的。
我的目標是用它們的文字字符替換代碼點。
您可以使用strconv.Unquote()
和strconv.UnquoteChar()
函數進行轉換。你應該知道的
的一件事是strconv.Unquote()
只能引文結束串是在引號(例如開始與報價焦炭"
或反引號字符`
結束),所以我們必須手動添加這一點。
見下面的例子:
lines := []string{
`\u0053`,
`\u0075`,
`\u006E`,
}
fmt.Println(lines)
for i, v := range lines {
var err error
lines[i], err = strconv.Unquote(`"` + v + `"`)
if err != nil {
fmt.Println(err)
}
}
fmt.Println(lines)
fmt.Println(strconv.Unquote(`"Go\u0070\x68\x65\x72"`))
輸出(嘗試在Go Playground):
[\u0053 \u0075 \u006E]
[S u n]
Gopher <nil>
稍微不同的方法是使用strconv.ParseInt
,這會產生較少的垃圾和使用較少的內部邏輯(Unquote
做很多其他檢查)來解析這些行:
for i, v := range lines {
if len(v) != 6 {
continue
}
if r, err := strconv.ParseInt(v[2:], 16, 32); err == nil {
lines[i] = string(r)
}
}