如果你运行
但是如何从字符 '啊' 获取 unicode 风格的字符串
fmt.Println("\u554a")
,它会显示 '啊'。但是如何从字符 '啊' 获取 unicode 风格的字符串
\u554a
?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
RuneToASCII
版本,但为什么不直接给我们没有引号的函数呢?我担心这样做不够整洁,因为要处理引号。所以我只是在上面给出了一个名为 RuneToASCII
的函数。这似乎更有效率。 - hardPass\u554a
-> 啊? - 425nesp在我看来,它应该更好:
func RuneToAscii(r rune) string {
if r < 128 {
return string(r)
} else {
return "\\u" + strconv.FormatInt(int64(r), 16)
}
}
fmt.Sprintf
和%U
一起获取十六进制值:test = fmt.Sprintf("%U", '啊')
fmt.Println("\\u" + test[2:]) // Print \u554A
func RuneToAscii(r rune) string
,如上所示。 - hardPasspackage main
import "fmt"
func main() {
fmt.Printf("%+q", '啊')
}
package main
import "fmt"
func main() {
r := rune('啊')
u := fmt.Sprintf("%U", r)
fmt.Println(string(r), u)
}
输出:
啊 U+554A
\u554A
而不是U+554A
。要获取\u554A
,仍需要进行一些额外的操作。这并不够简洁。 - hardPassfmt.Printf("\\u%X", '啊')
http://play.golang.org/p/Jh9ns8Qh15
(大写或小写的 'x' 将控制十六进制字符的大小写)
正如 fmt 包的 文档 所示:
%U Unicode 格式:U+1234;与 "U+%04X" 相同
strconv
包。 - xpt这样就可以完成工作了。
package main
import (
"fmt"
)
func main() {
str := fmt.Sprintf("%s", []byte{0x80})
fmt.Println(str)
}
strconv.FormatInt
将会导致\ufc
,这将在Go中导致Unicode语法错误。与Go理解的完整的\u00fc
相反。fmt.Sprintf
和十六进制格式化填充零可以解决这个问题:func RuneToAscii(r rune) string {
if r < 128 {
return string(r)
} else {
return fmt.Sprintf("\\u%04x", r)
}
}
\uXXXX
格式代替非ASCII字符(如“世界”)是非常常见的。请尝试使用jquery.getJSON()
加载以下JSON数据:{"one": "\u554a ", "two": "啊"}
。在页面上,您会发现其中一个正常显示,但另一个则显示乱码。 - hardPass