从字节转换unicode字符

时间:2009-02-17 14:40:54

标签: c# unicode types

在我们的API中,我们使用byte []通过网络发送数据。一切正常,直到我们的“外国”客户决定传递/接收Unicode字符的那一天。

据我所知,Unicode字符占用2个字节,但是,我们只在字节数组中为它们分配1个字节。

以下是我们如何从byte []数组中读取字符:

       // buffer is a byte[6553] and index is a current location in the buffer
        char c = System.BitConverter.ToChar(buffer, m_index);
        index += SIZEOF_BYTE;

        return c;

因此,当我查看Unicode十六进制时,当前的问题是API正在接收一个奇怪的Unicode字符。我发现最后一个有效字节是正确的,但是当它应该是0时,最重要的字节有一个值。到目前为止,一个快速的解决方法是0x00FF& c过滤msb。

请建议正确处理来自套接字的Unicode字符的方法吗?

感谢。

解决方案:

向Jon致敬:

char c =(char)buffer [m_index];

正如他所提到的,它起作用的原因是因为客户端api只接收一个占用一个字节的字符,BitConverter.ToChar使用两个字符,因此转换它的问题。我仍然很惊讶为什么它适用于某些角色而不是其他角色,因为它在所有情况下都应该失败。

谢谢大家,很棒的回复!

7 个答案:

答案 0 :(得分:6)

您应该使用Encoding.GetString,使用最合适的编码。

我并不完全了解你的情况,但Encoding类几乎肯定是处理它的方法。

谁在这里控制数据?您的代码或客户代码?您是否定义了正确的格式?

编辑:好的,我再看一下你的代码:BitConverter.ToChar返回“由startIndex开头的两个字节组成的字符。”如果您只想使用一个字节,只需将其转换为:

char c = (char) buffer[m_index];

我很惊讶你的代码一直在工作,因为它会在下一个字节非零时打破。

答案 1 :(得分:0)

您应该查看System.Text.ASCIIEncoder.ASCII.GetString函数,该函数接受byte []数组并将其转换为字符串(对于ascii)。

System.Text.UTF8Encoder或System.Text.UTF16Encoder,用于UTF8或UTF16编码中的Unicode字符串。

在ASCIIEncoding,UTF8Encoding和UTF16Encoding类中还有将字符串转换为字节[]的函数:请参阅GetBytes(String)函数。

答案 2 :(得分:0)

Unicode字符最多可占用四个字节,但很少是在线上编码的消息,每个字符使用4个字节。相反,使用UTF8或UTF16等方案,只在需要时才会带来额外的字节。

查看Encoding课程指南。

答案 3 :(得分:0)

测试流应包含byte-order marker,以便您确定如何处理二进制数据。

答案 4 :(得分:0)

目前还不清楚你的目标是什么。据我所知,你可以选择两条路线

  1. 忽略以Unicode发送的所有数据
  2. 处理unicode和ASCII字符串
  3. 恕我直言,#1是要走的路。但听起来你的协议不一定要设置为处理unicode字符串。您必须执行一些检测逻辑以确定进入的字符串是否为Unicode版本。如果是,您可以使用Enconding.Unicode.GetString方法转换该特定字节数组。

答案 5 :(得分:0)

您的客户使用哪种编码?如果您的某些客户仍在使用ASCII,那么您将需要您的国际客户使用将ASCII集(1-127)映射到自身的内容,例如UTF8。之后,使用UTF8编码的GetString方法。

答案 6 :(得分:0)

我唯一的解决方案是修复API。告诉用户在Byte []中仅使用ASCII字符串,或者修改它以支持ASCII和您需要使用的任何其他编码。

确定外部客户端从byte []提供的编码可能有点棘手。