Mic*_*ael 1 string unicode type-conversion go
我尝试将Go中的字符串字符的unicode值作为Int值.
我这样做:
value = strconv.Itoa(int(([]byte(char))[0]))
Run Code Online (Sandbox Code Playgroud)
其中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))
Run Code Online (Sandbox Code Playgroud)
任何提示,以减少欢迎...
字符串是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:]
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
65 1
197 2
196 2
214 2
编辑:(澄清迈克尔的补充)
Ä可以使用不同的unicode代码点创建一个字符:
预组合: Ä(U + 00C4)
使用组合分离: A(U + 0041)+ ¨(U + 0308)
为了获得预先组合的表单,可以使用规范化包golang.org/x/text/unicode/norm.NFC(Canonical Decomposition,然后是Canonical Composition)形式将U + 0041 + U + 0308转换为U + 00C4:
c := "\u0041\u0308"
r, _ := utf8.DecodeRune(norm.NFC.Bytes([]byte(c)))
fmt.Printf("%+q", r) // '\u00c4'
Run Code Online (Sandbox Code Playgroud)
Go 中的“字符”类型是 ,rune它是 的别名int32,另见Rune 文字。Arune是标识 Unicode 代码点的整数值。
在 Go 中,strings 被表示和存储为文本的 UTF-8 编码字节序列。循环的range形式for遍历rune文本的s:
s := "äöüÄÖÜ??"
for _, r := range s {
fmt.Printf("%c - %d\n", r, r)
}
Run Code Online (Sandbox Code Playgroud)
输出:
ä - 228
ö - 246
ü - 252
Ä - 196
Ö - 214
Ü - 220
? - 19990
? - 30028
Run Code Online (Sandbox Code Playgroud)
在Go Playground上试一试。
如果您想了解有关该主题的更多信息,请阅读此博客文章:
你可以使用这个unicode/utf8包
rune,_:=utf8.DecodeRuneInString("Ä")
fmt.Println(rune)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3774 次 |
| 最近记录: |