Golang将整数转换为unicode字符

时间:2017-03-29 12:54:16

标签: string go unicode

给出以下输入:

intVal := 2612
strVal := "2612"

什么是以字符串形式映射到关联的unicode值的机制。

例如,以下代码打印“☒”

fmt.Println("\u2612")

但以下不起作用:

fmt.Println("\\u" + strVal)

我研究过符文,strconvunicode/utf8,但无法找到合适的转换策略。

2 个答案:

答案 0 :(得分:4)

2612不是unicode符文的整数值,\u2612的整数值是9746。字符串"2612"是符文的十六进制值,因此将其解析为十六进制数并将其转换为rune

i, err := strconv.ParseInt(strVal, 16, 32)
if err != nil {
    log.Fatal(err)
}
r := rune(i)
fmt.Println(string(r))

https://play.golang.org/p/t_e6AfbKQq

答案 1 :(得分:2)

这个有效:

fmt.Println("\u2612")

因为在源代码中指定了interpreted string literal,并且编译器将取消引用(解释)它。 处理此不引用的fmt包。

这不起作用:

fmt.Println("\\u" + strVal)

因为再次使用解释的字符串文字,它将被解析为string\u,然后它将与局部变量strVal的值连接,即{ {1}},因此最终的2612值为string。但这不是一个解释的字符串文字,这是" final"结果。这不会被进一步处理/取消引用。

除了JimB的回答之外,您还可以使用strconv.Unquote(),它与编译器的做法类似。

见这个例子:

\u2612

输出(在Go Playground上尝试):

// The original that works:
s := "\u2612"
fmt.Println(s, []byte(s))

// Using strconv.Unquote():
strVal := "2612"
s2, err := strconv.Unquote(`"\u` + strVal + `"`)
fmt.Println(s2, []byte(s2), err)
fmt.Println(s == s2)

此处需要注意的一点:我们希望☒ [226 152 146] ☒ [226 152 146] <nil> true 取消引用\u2612文字,但strconv.Unquote()要求不引用引号的字符串(&#34 ; Unquote将s解释为单引号,双引号或反引号的Go字符串文字...&#34; ),这就是为什么我们用引号预先添加它后面。< / p>