【发布时间】:2010-10-08 02:41:19
【问题描述】:
在我们的 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 字符的正确方法?
谢谢。
解决方案:
向乔恩致敬:
char c = (char) 缓冲区[m_index];
正如他所提到的,它起作用的原因是因为客户端 api 接收到一个只占用一个字节的字符,而 BitConverter.ToChar 使用了两个,因此在转换它时存在问题。我仍然对为什么它适用于某些角色而不是其他角色感到惊讶,因为它应该在所有情况下都失败。
谢谢大家,很好的回应!
【问题讨论】:
-
“据我所知,Unicode 字符占用 2 个字节”这是错误的。最好的简化方法是认为“ASCII 已过时,文本字节流是 UTF8”,因此无论何时将它们从应用程序中取出/放入应用程序时,总是做一些编码/解码以在内部与 UTF8 进行转换。
-
这种简化是错误的,因为它假定 UTF-8 无处不在——当然不是这样。是的,UTF-8 很常见,但假设它无处不在是错误的。最好的态度是根本不简化:在编码/解码时,您应该始终知道编码。不要假设。
-
在这种情况下,我没有假设,因为我查看了服务器端代码,并看到它确实发送了一个打包在 1 个字节中的字符(没有任何编码)。尽管如此,我同意在编码/解码之前应该研究正确的编码。谢谢