从字节数组中获取正确格式的字符串
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 我在上面的答案中添加了更多内容。看看它是否有效。以上是关于从字节数组中获取正确格式的字符串的主要内容,如果未能解决你的问题,请参考以下文章
Ruby 1.9:将字节数组转换为具有多字节 UTF-8 字符的字符串