从字节数组中获取正确格式的字符串

Posted

技术标签:

【中文标题】从字节数组中获取正确格式的字符串【英文标题】:Getting string in right format from byte array 【发布时间】:2021-12-06 03:29:44 【问题描述】:

我在将字节数组转换为正确格式的字符串时遇到问题。我通过 TCP 套接字读取字节数组,它给了我字节,其中一个字节是 byte 158。 如果我读取字符串:

Encoding.Latin1.GetString(data)

它给了我格式的字符串 “blahblah\u009eblahblah”。 \u009e 是字母ž的代码。 我需要的刺痛应该是 “废话ž废话”。 我怎样才能得到正确格式的字符串?

我已经尝试过其他编码,如 ACSII、UTF8 等。但没有一个让我得到正确的格式。

编辑 一些代码示例我如何获取数据以及我如何处理它:

TcpClient client = new TcpClient(terminal.server_IP, terminal.port);
        NetworkStream stream = client.GetStream();
        stream.ReadTimeout = 2000;

        string message = "some message for terminal";
        byte[] msg = Encoding.Latin1.GetBytes(message);

        stream.Write(msg, 0, msg.Length);
        int bytes = stream.Read(data, 0, data.Length);
        string rsp = Encoding.Latin1.GetString(data, 0, bytes);

EDIT2 所以,我不知道是什么问题......刚刚为 .NET Framework 版本 4.7.2 创建了一个新项目,在该项目中它的工作正常。感谢大家的建议,感谢@Jeppe Stig Nielsen

【问题讨论】:

***.com/questions/14057434/… 这看起来很像 unicode。我真的很想知道为什么 UTF8 不起作用。你能发一个minimal reproducible example 让我们重现这个吗? 字节数组是否真的包含Unicode字符的文本表示?您如何查看结果。您从哪里获取数据? 能否提供字节数组,好吗?您可以使用string dump = string.Join(" ", msg); Console.WriteLine(dump); 进行操作。然后,请提供所需的 string @Taliga 有很多聪明的人在这里试图帮助你,如果有人要求你提供他们认为与问题的明确性相关的东西,你应该答应而不是拒绝这样的要求跨度> 【参考方案1】:

Encoding.Latin1 在您的情况下不可用。真正的拉丁文 1 不包含 ž(LATIN SMALL LETTER Z WITH CARON)。

如果您想要 Windows-1252,请使用

Encoding.GetEncoding("Windows-1252").GetString(data)

这会将十进制值158(十六进制0x9E)的字节转换为小写ž。


您也可能是"Windows-1250"。您希望文本中出现哪些其他非英文字母?比较Windows-1252 和Windows-1250;它们通常不同,但都同意十六进制字节0x9E(dec 158)是ž。


在 .NET Core 系统上,如果上述方法无法立即运行,请尝试执行:

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
var goodText = Encoding.GetEncoding("Windows-1252").GetString(data);

查找CodePagesEncodingProvider 类型可能需要引用程序集System.Text.Encoding.CodePages.dll

【讨论】:

尝试了 Encoding.GetEncoding("Windows-1252") 出错:“Windows-1252”不是受支持的编码名称。有关定义自定义编码的信息,请参阅 Encoding.RegisterProvider 方法的文档。 @Taliga 你说得对,我使用的是旧的 .NET Framework(这也解释了为什么我没有看到 .NET 5 中新的 Latin1 属性)。你需要弄清楚你是否有Windows-1252 或Windows-1250 或类似的。编辑:您是在 Windows 下,还是在其他操作系统下? Windows-1250 抛出同样的错误,我在 windows 下,使用 .NET 5.0 的 WPF 项目 @Taliga 我在上面的答案中添加了更多内容。看看它是否有效。

以上是关于从字节数组中获取正确格式的字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C# 中的 Web Api 方法正确获取字节数组?

Ruby 1.9:将字节数组转换为具有多字节 UTF-8 字符的字符串

如何将字节数组转换为blob

字节数组赋值问题?

如何从 Java 中的 BigInteger 获取无符号字节数组?

VB如何读取一个图片,保存到字节数组中