给出以下输入:
intVal := 2612
strVal := "2612"
什么是以字符串形式映射到关联的unicode值的机制。
例如,以下代码打印“☒”
fmt.Println("\u2612")
但以下不起作用:
fmt.Println("\\u" + strVal)
我研究过符文,strconv
和unicode/utf8
,但无法找到合适的转换策略。
答案 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))
答案 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>