【问题标题】:C#'s Encoding.UTF8.GetString equivalent in Go [closed]Go中C#的Encoding.UTF8.GetString等价物[关闭]
【发布时间】: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。所以......我所说的一切仍然适用。确实:哈希几乎总是用十六进制表示

标签: c# go utf-8


【解决方案1】:

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

例如,

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

【讨论】:

    猜你喜欢
    • 2016-09-13
    • 2023-03-09
    • 2015-10-14
    • 2016-07-03
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    相关资源
    最近更新 更多