如何获取角色的Unicode值?

时间:2015-03-20 07:13:57

标签: string go unicode type-conversion

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

我这样做:

value = strconv.Itoa(int(([]byte(char))[0]))

其中char包含一个包含一个字符的字符串。

这适用于许多情况。它不适用于ä,ö,ü,Ä,Ö,Ü等变音符号。

E.g。 Ä结果为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)) 

任何暗示让这个更短暂的欢迎......

3 个答案:

答案 0 :(得分:6)

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

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

可以使用不同的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'

答案 1 :(得分:4)

您可以使用unicode/utf8

rune,_:=utf8.DecodeRuneInString("Ä")
fmt.Println(rune)

答案 2 :(得分:4)

&#34;字符&#34;在Go中输入runeint32的别名,另请参阅Rune literalsrune是标识Unicode代码点的整数值。

在Go string中表示并存储为文本的UTF-8编码字节序列。 range循环的for形式遍历文本的rune

s := "äöüÄÖÜ世界"
for _, r := range s {
    fmt.Printf("%c - %d\n", r, r)
}

输出:

ä - 228
ö - 246
ü - 252
Ä - 196
Ö - 214
Ü - 220
世 - 19990
界 - 30028

Go Playground上尝试。

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

Strings, bytes, runes and characters in Go