C# 从字节转换unicode字符
在我们的API中,我们使用byte[]通过网络发送数据。一切正常,直到有一天我们的“外国”客户决定传递/接收Unicode字符C# 从字节转换unicode字符,c#,unicode,types,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
据我所知,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字符的正确方法
谢谢
解决方案:
乔恩的荣誉:
字符c=(字符)缓冲区[m_索引]
正如他所提到的,它之所以有效,是因为客户端api接收到的字符只占一个字节,而BitConverter.ToChar使用两个字节,因此转换它时会出现问题。我仍然很惊讶为什么它对某些角色有效,而不是其他角色,因为它在所有情况下都应该失败
谢谢大家,反应很好 您应该使用,使用最合适的编码
我不完全理解您的情况,但是编码类几乎肯定是处理它的方法
谁在控制这里的数据?你的代码,还是你客户的代码?您是否定义了正确的格式
编辑:好的,我又看了一遍你的代码:BitConverter.ToChar返回“一个由两个字节组成的字符,从startIndex开始。”如果你只想使用一个字节,只需强制转换它:
char c = (char) buffer[m_index];
我很惊讶你的代码一直在工作,因为下一个字节不为零时,它就会中断。你应该看看System.Text.ASCIIEncoder.ASCII.GetString函数,它接受字节[]数组并将其转换为字符串(用于ASCII)
和System.Text.UTF8Encoder或System.Text.UTF16Encoder,用于UTF8或UTF16编码中的Unicode字符串
在AscienceODing、UTF8Encoding和UTF16Encoding类中还有将字符串转换为字节[]的函数:请参阅GetBytes(String)函数。Unicode字符最多可以占用四个字节,但很少在有线上使用每个字符四个字节对消息进行编码。相反,像UTF8或UTF16这样的方案只会在需要时引入额外的字节
请看一看课程指南。测试流应该包含一个可以让您确定如何处理二进制数据的选项。不清楚您的具体目标是什么。据我所知,你可以走两条路
忽略以Unicode格式发送的所有数据
处理unicode和ASCII字符串
我想,1号才是最好的选择。但听起来您的协议不一定是用来处理unicode字符串的。您必须执行一些检测逻辑来确定输入的字符串是否为Unicode版本。如果是,您可以使用Enconding.Unicode.GetString方法转换特定的字节数组。您的客户使用什么编码?如果您的一些客户仍在使用ASCII,那么您需要您的国际客户使用将ASCII集(1-127)映射到自身的东西,例如UTF8。然后,使用UTF8编码的GetString方法。我唯一的解决方案是修复API。告诉用户仅使用字节[]中的ASCII字符串,或者修复它以支持ASCII和需要使用的任何其他编码
仅从字节[]确定外部客户端提供的编码可能有点棘手。这可能有点棘手,因为我们还通过str=System.Text.ascienceoding.ASCII.GetString()从网络接收字符串。也许,我误解了你的反应。你能给我举个例子吗。谢谢如果您使用Encoding.ASCII,您将无法处理任何重音字符。我建议您在问题中提供更多信息。“据我所知,Unicode字符占用2个字节”这是错误的。最好的简化是认为“ASCII已经过时,text BYTESTream是UTF8”,因此,无论何时您将它们取出/放入应用程序,都要进行一些编码/解码,以将内部转换为UTF8或从UTF8转换为UTF8。这种简化是错误的,因为它假设到处都是UTF-8,但事实并非如此。是的,UTF-8非常常见,但假设它无处不在是一个错误。最好的态度是一点也不简化:在编码/解码时,您应该始终知道编码。不要假设。在本例中,我没有假设,因为我查看了服务器端代码,发现它确实是发送一个1字节的字符(没有任何编码)。尽管如此,我同意在编码/解码之前应该调查正确的编码。谢谢