String 如何获取go中字符的Unicode值?

String 如何获取go中字符的Unicode值?,string,go,unicode,type-conversion,String,Go,Unicode,Type Conversion,我尝试将Go中字符串的unicode值作为Int值 我这样做: value = strconv.Itoa(int(([]byte(char))[0])) 其中char包含一个带有一个字符的字符串 这适用于许多情况。它不适用于像ä,ö,ü,Ä,Ü,Ü这样的乌姆洛特人 例如,Ä的结果为65,这与A的结果相同 我该怎么做 补充:我有两个问题。第一个问题用下面的任何一个答案解决了。第二个有点棘手。我的输入不是标准化的UTF-8代码,例如,UMLAUT由两个字符而不是一个字符表示。正如ANisus所说,

我尝试将Go中字符串的unicode值作为Int值

我这样做:

value = strconv.Itoa(int(([]byte(char))[0]))
其中char包含一个带有一个字符的字符串

这适用于许多情况。它不适用于像ä,ö,ü,Ä,Ü,Ü这样的乌姆洛特人

例如,Ä的结果为65,这与A的结果相同

我该怎么做

补充:我有两个问题。第一个问题用下面的任何一个答案解决了。第二个有点棘手。我的输入不是标准化的UTF-8代码,例如,UMLAUT由两个字符而不是一个字符表示。正如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编码的,因此要对字符串中的字符进行解码以获得
符文
(unicode代码点),可以使用该包

示例:

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:]
    }
}
结果:

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
1972
196 2
214 2

编辑:(澄清迈克尔的补充)

可以使用不同的unicode代码点创建诸如
Ä
之类的字符:

预合成:
Ä
(U+00C4)
使用组合分离:
A
(U+0041)+
)(U+0308)

为了获得预合成的表单,可以使用规范化包,
golang.org/x/text/unicode/norm
。NFC(正则分解, 后跟标准组合)形式将把U+0041+U+0308变成U+00C4:

c := "\u0041\u0308"
r, _ := utf8.DecodeRune(norm.NFC.Bytes([]byte(c)))
fmt.Printf("%+q", r) // '\u00c4'
Go中的“字符”类型是,它是
int32
的别名,另请参见。
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
试穿一下

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


是的,如果我使用常量赋值,例如str:=“Ä”,则该选项有效。然后长度为2,字节码为[195 132],这导致符文:196。但是我从一个文件中读取字符,长度是3,我得到字节码[65 204 136]和符文:65。fmt.Println将两个字符串输出为Ä。我不知道该文件是如何编码的。它是UTF8,但您有一个(U+0040)和一个组合分隔符(())字符(U+0308)。它们合起来就成了Ä。您需要做的是首先使用
golang.org/x/text/unicode/norm
包将字符串规范化为NFC格式。请随意将其添加到您的答案中。大多数人会在那里寻找它;-)@Michael I修改了回复以包含规范化部分。请注意:规范化不是特定的——它是unicode标准的一部分。
norm
包只是实现unicode规范化。
utf8.decodeRuneInstalling(norm.NFC.String(stringSource))
utf8.DecodeRune(norm.NFC.Bytes(byteSliceSource))
取决于实际输入是
字符串还是
[]字节
。避免字节片和字符串之间不必要的转换,因为它们可能导致复制。