If you run fmt.Println("\u554a")
, it shows '啊'.
But how to get unicode-style-string \u554a
from a rune '啊' ?
package main
import "fmt"
import "strconv"
func main() {
quoted := strconv.QuoteRuneToASCII('啊') // quoted = "'\u554a'"
unquoted := quoted[1:len(quoted)-1] // unquoted = "\u554a"
fmt.Println(unquoted)
}
这输出:
\u554a
恕我直言,应该更好:
func RuneToAscii(r rune) string {
if r < 128 {
return string(r)
} else {
return "\\u" + strconv.FormatInt(int64(r), 16)
}
}
您可以使用fmt.Sprintf
with%U
来获取十六进制值:
test = fmt.Sprintf("%U", '啊')
fmt.Println("\\u" + test[2:]) // Print \u554A
例如,
package main
import "fmt"
func main() {
r := rune('啊')
u := fmt.Sprintf("%U", r)
fmt.Println(string(r), u)
}
输出:
啊 U+554A
fmt.Printf("\\u%X", '啊')
http://play.golang.org/p/Jh9ns8Qh15
(大写或小写“x”将控制十六进制字符的大小写)
正如包 fmt 的文档所暗示的那样:
%U Unicode 格式:U+1234;与 "U+%04X" 相同
package main
import "fmt"
func main() {
fmt.Printf("%+q", '啊')
}
这会做的工作..
package main
import (
"fmt"
)
func main() {
str := fmt.Sprintf("%s", []byte{0x80})
fmt.Println(str)
}
我想补充一下 hardPass 的答案。
如果 unicode 的十六进制表示少于 4 个字符(例如 ü)strconv.FormatInt
,\ufc
这将导致 Go 中的 unicode 语法错误。\u00fc
与Go 所理解的完全相反。
fmt.Sprintf
使用with hex 格式用零填充十六进制将解决此问题:
func RuneToAscii(r rune) string {
if r < 128 {
return string(r)
} else {
return fmt.Sprintf("\\u%04x", r)
}
}