Ответ 1
ИМХО, должно быть лучше:
func RuneToAscii(r rune) string {
if r < 128 {
return string(r)
} else {
return "\\u" + strconv.FormatInt(int64(r), 16)
}
}
Если вы запустите fmt.Println("\u554a")
, он отобразит "啊".
Но как получить строку unicode-style \u554a
из руны '啊'?
ИМХО, должно быть лучше:
func RuneToAscii(r rune) string {
if r < 128 {
return string(r)
} else {
return "\\u" + strconv.FormatInt(int64(r), 16)
}
}
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
Вы можете использовать fmt.Sprintf
вместе с %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"
Я хотел бы добавить к ответу, который имеет hardPass.
В случае, когда шестнадцатеричное представление юникода меньше 4 символов (например, ü), strconv.FormatInt
приведет к \ufc
что приведет к ошибке синтаксиса юникода в Go. В отличие от полной \u00fc
которую понимает Go.
Заполнение гексагона нулями с помощью fmt.Sprintf
с шестнадцатеричным форматированием исправит это:
func RuneToAscii(r rune) string {
if r < 128 {
return string(r)
} else {
return fmt.Sprintf("\\u%04x", r)
}
}
Это сделало бы работу..
package main
import (
"fmt"
)
func main() {
str := fmt.Sprintf("%s", []byte{0x80})
fmt.Println(str)
}
package main
import "fmt"
func main() {
fmt.Printf("%+q", '啊')
}