go中的c s encoding.utf8.getString等效项

C#'s Encoding.UTF8.GetString equivalent in Go

go中的c s encoding.utf8.getString的等效值是什么?

正如我已经知道的,go的默认编码是utf8,而go中的字符串(somebytes)将生成一个utf8编码的字符串。

C:

1
2
3
4
5
6
7
public static void Main()
{
    byte[] bytes = new byte[] { 144, 197, 217, 192, 204, 249, 181, 42, 92, 252, 243, 87, 170, 243, 169, 80, 175, 112, 192, 239};
    string str = Encoding.UTF8.GetString(bytes);

    Console.WriteLine(str);
 }

去:

1
2
3
4
5
func main() {
bytes := []byte { 144, 197, 217, 192, 204, 249, 181, 42, 92, 252, 243, 87, 170, 243, 169, 80, 175, 112, 192, 239}
str := string(bytes)
fmt.Println(str)
}

C代码产生:

1
???????*\??W??P?p??

Go代码生成:

1
???????*\??W???P?p??

我这里缺少什么?


很明显,不管你怎么看,你的bytes不是有效的utf-8。

例如,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main

import (
   "fmt"
)

func main() {
    bytes := []byte{144, 197, 217, 192, 204, 249, 181, 42, 92, 252, 243, 87, 170, 243, 169, 80, 175, 112, 192, 239}
    fmt.Println(len(bytes))
    fmt.Printf("%v
"
, bytes)
    fmt.Printf("% x
"
, bytes)
    fmt.Printf("%q
"
, bytes)
    fmt.Printf("%s
"
, bytes)
}

游乐场:https://play.golang.org/p/bhkeguzck

输出:

1
2
3
4
5
20
[144 197 217 192 204 249 181 42 92 252 243 87 170 243 169 80 175 112 192 239]
90 c5 d9 c0 cc f9 b5 2a 5c fc f3 57 aa f3 a9 50 af 70 c0 ef
"\x90\xc5\xd9\xc0\xcc\xf9\xb5*\\\xfc\xf3W\xaa\xf3\xa9P\xafp\xc0\xef"
???????*\??W???P?p??

参考文献:

Unicode联合体

unicode:utf-8、utf-16、utf-32&bom

UTF-8-维基百科

go博客:go中的字符串、字节、符文和字符

转到:包UTF8