Go中C#的Encoding.UTF8.GetString等价物[关闭]

Posted

技术标签:

【中文标题】Go中C#的Encoding.UTF8.GetString等价物[关闭]【英文标题】:C#'s Encoding.UTF8.GetString equivalent in Go [closed] 【发布时间】:2019-06-23 18:11:38 【问题描述】:

Go 中 C# 的 Encoding.UTF8.GetString 的等价物是什么?

我已经知道 Go 的默认编码是 UTF8,而 Go 中的 string(somebytes) 会产生一个 UTF8 编码的字符串。

C#:

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);
 

去:

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# 代码产生:

�������*\��W��P�p��

Go 代码产生:

�������*\��W���P�p��

我在这里缺少什么?

【问题讨论】:

您的输入字节序列不是有效的 UTF-8 字节序列,但您正试图这样对待它。 扩展@icza 的观点:如果您尝试对非 utf-8 输入的内容进行 utf-8 解码,则输出未定义。完全合理地期望两个不同的框架对于未定义的场景会有不同的结果。从技术上讲,单个框架根据星期几产生不同的结果是合法的……毕竟:undefined 或许在这里探索一个更有成效的途径是 - 你想做什么?:由于该数据不是 utf-8,因此将其明确解码为 utf-8不是一个好的选择。将其显示为十六进制对您有用吗? @MarcGravell:“如果您尝试对非 utf-8 输入的内容进行 utf-8 解码,则输出未定义。” UTF-8 和 Go 的合著者 Rob Pike 返回 Go 中无效 UTF-8 的 Unicode 替换字符。输出是明确定义的,尽管它可能没有用。 @Kunal hmac sha 哈希的输出是 not utf-8。所以......我所说的一切仍然适用。确实:哈希几乎总是用十六进制表示 【参考方案1】:

显然,无论您怎么看,您的 bytes 都不是有效的 UTF-8。

例如,

package main

import (
    "fmt"
)

func main() 
    bytes := []byte144, 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\n", bytes)
    fmt.Printf("% x\n", bytes)
    fmt.Printf("%q\n", bytes)
    fmt.Printf("%s\n", bytes)

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

输出:

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��

参考资料:

The Unicode Consortium

Unicode: UTF-8, UTF-16, UTF-32 & BOM

UTF-8 - Wikipedia

The Go Blog: Strings, bytes, runes and characters in Go

Go: Package utf8

【讨论】:

以上是关于Go中C#的Encoding.UTF8.GetString等价物[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

go与C#的匿名类型判断比较

[翻译]Go与C#对比 第三篇:编译运行时类型系统模块和其它的一切

[翻译]Go与C#对比 第三篇:编译运行时类型系统模块和其它的一切

GO语言与C#代码行数对比

go使用grpc实现go与go,go与C#相互调用

C# 调用 Go 语言0x1 Hello Golang