在我们的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使用两个字符,因此转换它的问题。我仍然很惊讶为什么它适用于某些角色而不是其他角色,因为它在所有情况下都应该失败。
谢谢大家,很棒的回复!
答案 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字符串。您必须执行一些检测逻辑以确定进入的字符串是否为Unicode版本。如果是,您可以使用Enconding.Unicode.GetString方法转换该特定字节数组。
答案 5 :(得分:0)
您的客户使用哪种编码?如果您的某些客户仍在使用ASCII,那么您将需要您的国际客户使用将ASCII集(1-127)映射到自身的内容,例如UTF8。之后,使用UTF8编码的GetString方法。
答案 6 :(得分:0)
我唯一的解决方案是修复API。告诉用户在Byte []中仅使用ASCII字符串,或者修改它以支持ASCII和您需要使用的任何其他编码。
确定外部客户端从byte []提供的编码可能有点棘手。