如何获取角色的Unicode值?

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)

任何提示,以减少欢迎...

ANi*_*sus 7

字符串是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)

  • 它是UTF8好吧,但你有A(U + 0040)和组合分音符(¨)字符(U + 0308).结合起来他们变成了Ä.您需要做的是首先使用`golang.org/x/text/unicode/norm`包将字符串规范化为NFC形式. (2认同)

icz*_*cza 7

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上试一试。

如果您想了解有关该主题的更多信息,请阅读此博客文章:

Go 中的字符串、字节、符文和字符


Xi *_*gma 6

你可以使用这个unicode/utf8

rune,_:=utf8.DecodeRuneInString("Ä")
fmt.Println(rune)
Run Code Online (Sandbox Code Playgroud)