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#对比 第三篇:编译运行时类型系统模块和其它的一切