Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从字节转换unicode字符_C#_Unicode_Types - Fatal编程技术网

C# 从字节转换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

在我们的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字符的正确方法

谢谢

解决方案:

乔恩的荣誉:

字符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字节的字符(没有任何编码)。尽管如此,我同意在编码/解码之前应该调查正确的编码。谢谢