我可以在字节和字符串之间混合使用UTF-16转换和UTF-8转换吗?

时间:2014-03-20 15:22:39

标签: c# encoding utf-8

短版

这是身份功能吗?

f = (gₐ · hᵤ · gᵤ · hₐ)

其中:

  • hₐ是从字节到字符串的UTF-16 conversion
  • gₐ是从字符串到字节的UTF-16转换,
  • gᵤEncoding.UTF8.GetBytes()
  • hᵤEncoding.UTF8.GetString()

长版

我使用WebSocket4Net在C#应用程序和C#服务之间通过WebSockets发送和接收消息。

有些消息是二进制的,我应该在与库交互时将它们转换为字符串,因为当它的Send()方法允许发送字节数组时,它的MessageReceived将收到的消息作为只是一个字符串。

要将字节转换为字符串,将字符串转换为字节,请遵循the answer by Mehrdad,其中使用.NET Framework的内部编码,即UTF-16。

另一方面,根据代码源(参见例如DraftHybi10Processor.cs, line 114),WebSocket4Net使用UTF-8将字符串转换为字节,将字节转换为字符串。

会引起问题吗?数据丢失是否可能?

1 个答案:

答案 0 :(得分:2)

如果你需要将二进制数据作为字符串发送,那么这就是Base-64和类似编码的用途。如果你需要将字符串作为字符串发送...好吧,将其作为字符串发送。如果您需要以字节形式发送字符串,Unicode(UTF-16)或UTF-8就可以了。字符串不是简单的字节数组(即使它们可以在必要时以这种方式表示)。 Unicode特别是一个非常复杂的编码(参见http://www.joelonsoftware.com/articles/Unicode.html;读它 - 这是必须的)。您是否知道可以获得将单个字符拆分为5个字节的unicode规范化?相同的字符也可以解释为2.或者是完全不同的数字。我没有观察到它,但我希望UTF-16中的某些字节数组完全无效(这是.NET中当前的默认字符串编码)。

我不打算证明你的“双重编码”是有缺陷的。我不确定,它甚至可能有用。但是,你要获得的字符串将非常愚蠢,你将很难编码它以确保你没有发送命令或其他东西。

更重要的是 - 你没有表现出意图。您正在进行微优化,并牺牲可读性。更糟糕的是,您依赖于实现细节,这些细节对于.NET的更高版本而言不一定是可移植的或稳定的,更不用说其他环境了。

除非你有非常非常好的理由(基于实际的性能分析,而不是“直觉”),否则请使用简单易读的解决方案。如果必须,您可以随时改进。

编辑:显示使用Unicode编码非unicode字节的原因的示例代码是一个坏主意:

Encoding.UTF8.GetBytes(Encoding.UTF8.GetString(new byte[] { 200, 8 }))

输入上的两个字节变为四个字节{ 239, 191, 189, 8 }。不完全是你想要的。