Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.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# 在C中从原始TCP流获取unicode字符串#_C#_Mysql_Utf 8 - Fatal编程技术网

C# 在C中从原始TCP流获取unicode字符串#

C# 在C中从原始TCP流获取unicode字符串#,c#,mysql,utf-8,C#,Mysql,Utf 8,所以我试图修改一些用C语言编写的软件,但我不是一个真正的开发人员。代码从客户端读取数据并从中获取值。我看到的问题是,当客户端的值使用非英语字符时,它就会变成jibberish。有关守则是: public static string ReadNT(BinaryReader stream) { ret = ""; byte addByte = 0x00; do { addByte = ReadByte(stream); if (addByte != 0x00)

所以我试图修改一些用C语言编写的软件,但我不是一个真正的开发人员。代码从客户端读取数据并从中获取值。我看到的问题是,当客户端的值使用非英语字符时,它就会变成jibberish。有关守则是:

public static string ReadNT(BinaryReader stream)
{
  ret = "";
  byte addByte = 0x00;
  do {
    addByte = ReadByte(stream);
    if (addByte != 0x00)
      ret += (char)addByte;
  } while (addByte != 0x00);
  return ret;
}
据我所知,它正在通过流将内容逐个转换为字符以获得字符串。问题是它不适用于unicode/utf8。有没有办法将其转换为可与utf8值一起使用的字符串?

尝试以下方法:

public static string ReadNT(BinaryReader stream)
{
    List<byte> bytes = new List<byte>();
    byte addByte = 0x00;

    do
    {
        addByte = ReadByte(stream);

        if (addByte != 0x00)
        {
            bytes.Add((char)addByte);
        }
    } while (addByte != 0x00);

    return Encoding.UTF8.GetString(bytes.ToArray());
}
publicstaticstringreadnt(二进制读取器流)
{
列表字节=新列表();
字节addByte=0x00;
做
{
addByte=ReadByte(流);
如果(addByte!=0x00)
{
字节。添加((char)addByte);
}
}while(addByte!=0x00);
返回Encoding.UTF8.GetString(bytes.ToArray());
}
您不能一次转换一个字符,因为有些字符可以用多个字节表示,因此我使用
列表来收集整个流

我认为这里需要注意的是,您需要确保客户端正在向您发送UTF8格式的文本

编辑:

关于对本答案的评论,请参见

是的,UTF8中的零字节是代码点0,NUL。没有其他Unicode代码点将以UTF8编码,其中任何位置都包含零字节


因此,可以安全地假设,如果您收到一个零字节,那么它是NUL,实际上不是代码点的一部分。

您可以尝试使用StreamReader类来读取UTF8字符串

public static string ReadNT(BinaryReader stream)
{
   return (new StreamReader(stream, Encoding.UTF8, false)).ReadString();
}

除了字符串本身之外,还应该考虑传递字符串的大小,如果这是你可以控制的。

public static string ReadNT(BinaryReader stream, int length)
{
    return Encoding.UTF8.GetString(stream.ReadBytes(length));
}

您应该从我对unicode的理解(尽管有限)中了解UTF8Encoding类,我认为您不能保证每个字符的大小。因此,像这样一次抓取一个字节将需要大量的变通方法。您最好的选择可能是一次读取整个流,然后对其进行解码。@Dan对于UTF8,您通常需要在一个类型中读取一个字节,因为它是可变长度的。“不是真正的开发人员”:我会在这里停下来,不继续处理流,除非您了解更多信息。如果UTF-8字符的最后一个字节是
0x00
,该怎么办?是否为两字节(utf8编码)字符?0的第一位表示后面没有任何内容,然后解码字符的最后7位有7个0。@ColeJohnson这是一个好问题-我也关心这个问题,但从更一般的意义上讲,例如,
0x00
在四字节字符中显示为第二或第三字节。根据(描述部分),看起来多字节字符不会包含零字节。这不是OP特别要求的,但我喜欢