如何获取字符的 Unicode 值?
How can I get the Unicode value of a character in go?
我尝试获取 Go 中字符串字符的 unicode 值作为 Int 值。
我这样做:
value = strconv.Itoa(int(([]byte(char))[0]))
其中 char 包含一个包含一个字符的字符串。
这适用于许多情况。它不适用于 ä、ö、ü、Ä、Ö、Ü 等变音符号。
例如Ä 结果为 65,与 A 相同。
我该怎么做?
补充:我有两个问题。第一个已通过以下任何答案解决。第二个有点棘手。我的输入不是 Go 规范化的 UTF-8 代码,例如变音符号由两个字符而不是一个字符表示。正如 ANisus 所说,解决方案在包 golang 中找到。org/x/text/unicode/norm。上面的行现在是两行:
rune, _ := utf8.DecodeRune(norm.NFC.Bytes([]byte(char)))
value = strconv.Itoa(int(rune))
任何可以缩短欢迎词的提示...
您可以使用 unicode/utf8
包
rune,_:=utf8.DecodeRuneInString("Ä")
fmt.Println(rune)
字符串是 utf8 编码的,因此要从字符串中解码字符以获得 rune
(unicode 代码点),您可以使用 unicode/utf8
包。
示例:
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
str := "AÅÄÖ"
for len(str) > 0 {
r, size := utf8.DecodeRuneInString(str)
fmt.Printf("%d %v\n", r, size)
str = str[size:]
}
}
结果:
65 1
197 2
196 2
214 2
编辑:(澄清 Michael 的补充)
可以使用不同的 unicode 代码点创建诸如 Ä
的字符:
预合成: Ä
(U+00C4)
使用组合分音符: A
(U+0041) + ¨
(U+0308)
为了获得预组合形式,可以使用规范化包,golang.org/x/text/unicode/norm
。 NFC(规范分解,
后跟 Canonical Composition) 形式会将 U+0041 + U+0308 变成 U+00C4:
c := "\u0041\u0308"
r, _ := utf8.DecodeRune(norm.NFC.Bytes([]byte(c)))
fmt.Printf("%+q", r) // '\u00c4'
Go 中的 "character" 类型是 rune
which is an alias for int32
, see also Rune literals。 rune
是标识 Unicode 代码点的整数值。
在 Go 中,string
s 被表示和存储为文本的 UTF-8 编码字节序列。 for
循环的 range
形式迭代文本的 rune
s:
s := "äöüÄÖÜ世界"
for _, r := range s {
fmt.Printf("%c - %d\n", r, r)
}
输出:
ä - 228
ö - 246
ü - 252
Ä - 196
Ö - 214
Ü - 220
世 - 19990
界 - 30028
在 Go Playground 上试试。
如果您想了解有关该主题的更多信息,请阅读这篇博客文章:
我尝试获取 Go 中字符串字符的 unicode 值作为 Int 值。
我这样做:
value = strconv.Itoa(int(([]byte(char))[0]))
其中 char 包含一个包含一个字符的字符串。
这适用于许多情况。它不适用于 ä、ö、ü、Ä、Ö、Ü 等变音符号。
例如Ä 结果为 65,与 A 相同。
我该怎么做?
补充:我有两个问题。第一个已通过以下任何答案解决。第二个有点棘手。我的输入不是 Go 规范化的 UTF-8 代码,例如变音符号由两个字符而不是一个字符表示。正如 ANisus 所说,解决方案在包 golang 中找到。org/x/text/unicode/norm。上面的行现在是两行:
rune, _ := utf8.DecodeRune(norm.NFC.Bytes([]byte(char)))
value = strconv.Itoa(int(rune))
任何可以缩短欢迎词的提示...
您可以使用 unicode/utf8
包
rune,_:=utf8.DecodeRuneInString("Ä")
fmt.Println(rune)
字符串是 utf8 编码的,因此要从字符串中解码字符以获得 rune
(unicode 代码点),您可以使用 unicode/utf8
包。
示例:
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
str := "AÅÄÖ"
for len(str) > 0 {
r, size := utf8.DecodeRuneInString(str)
fmt.Printf("%d %v\n", r, size)
str = str[size:]
}
}
结果:
65 1
197 2
196 2
214 2
编辑:(澄清 Michael 的补充)
可以使用不同的 unicode 代码点创建诸如 Ä
的字符:
预合成: Ä
(U+00C4)
使用组合分音符: A
(U+0041) + ¨
(U+0308)
为了获得预组合形式,可以使用规范化包,golang.org/x/text/unicode/norm
。 NFC(规范分解,
后跟 Canonical Composition) 形式会将 U+0041 + U+0308 变成 U+00C4:
c := "\u0041\u0308"
r, _ := utf8.DecodeRune(norm.NFC.Bytes([]byte(c)))
fmt.Printf("%+q", r) // '\u00c4'
Go 中的 "character" 类型是 rune
which is an alias for int32
, see also Rune literals。 rune
是标识 Unicode 代码点的整数值。
在 Go 中,string
s 被表示和存储为文本的 UTF-8 编码字节序列。 for
循环的 range
形式迭代文本的 rune
s:
s := "äöüÄÖÜ世界"
for _, r := range s {
fmt.Printf("%c - %d\n", r, r)
}
输出:
ä - 228
ö - 246
ü - 252
Ä - 196
Ö - 214
Ü - 220
世 - 19990
界 - 30028
在 Go Playground 上试试。
如果您想了解有关该主题的更多信息,请阅读这篇博客文章: