将Go中的unicode代码点转换为文字字符

将Go中的unicode代码点转换为文字字符,unicode,go,Unicode,Go,假设我有一个这样的文本文件 \u0053 \u0075 \u006E 有没有办法把它转换成这个 S u n 目前,我使用的是ioutil.ReadFile(“data.txt”),但是当我打印数据时,我得到的是unicode代码点,而不是字符串文本。我意识到这是ReadFile的正确行为,这不是我想要的 我的目标是用文字字符替换代码点。您可以使用和函数进行转换 您应该注意的一点是,strconv.Unquote()只能对引号中的字符串进行解压缩(例如,以引号char“开头和结尾,或以反引号c

假设我有一个这样的文本文件

\u0053
\u0075
\u006E
有没有办法把它转换成这个

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

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

您可以使用和函数进行转换

您应该注意的一点是,
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"`))
输出(在上尝试):

[\u0053\u0075\u006E]
[新加坡]
地鼠

使用了一种稍有不同的方法,这会生成更少的垃圾,并使用更少的内部逻辑(执行许多其他检查)来解析行:

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)
    }
}

如何处理已在引号中的字符串“\u0070\x68\x65\x72”。在我的测试中,它无法处理。@user3875388如果它已包含引号,只需不添加引号即可。请参阅上的工作示例
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)
    }
}