在Go

时间:2015-12-07 04:59:36

标签: unicode go

我们说我有一个像这样的文本文件。

\u0053
\u0075
\u006E

有没有办法可以将其转换为此?

S
u
n

目前,我正在使用ioutil.ReadFile("data.txt"),但是当我打印数据时,我获得了unicode代码点而不是字符串文字。我意识到这是ReadFile的正确行为,它不是我想要的。

我的目标是用他们的文字字符替换代码点。

2 个答案:

答案 0 :(得分:3)

您可以使用strconv.Unquote()strconv.UnquoteChar()功能进行转换。

您应该注意的一点是strconv.Unquote()只能取消引号中的字符串(例如,引号char "或后引号char `的开头和结尾) ,所以我们必须手动追加。

见这个例子:

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>

答案 1 :(得分:2)

稍微不同的方法是使用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)
    }
}

playground