【发布时间】: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。所以......我所说的一切仍然适用。确实:哈希几乎总是用十六进制表示