2012-11-15 40 views
3

因此,我试图对用C#编写的某些软件进行修改,但我并不是真正的开发人员。代码从客户端读取数据并从中获取数据。我看到的问题是,当你使用非英文字符的客户端的值时,它变得乱七八糟。有问题的代码是:从C#中的原始TCP流获取unicode字符串

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值?

+1

你应该检查出UTF8Encoding类http://msdn.microsoft.com/en-us/library/system.text.utf8encoding(v=vs.110).aspx –

+0

从我的(尽管有限)了解unicode,我认为你不能保证每个角色的大小。因此,像这样一次抓取一个字节将需要很多解决方法。您最好的选择可能是一次读取整个流,然后解码。 – Dan

+0

@Dan对于UTF8,你需要在一个类型中读取它的一个字节,因为它是可变长度的。 –

回答

0

试试这个:

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()); 
} 

你不能一个字符转换的时间,一些可能在多于一个字节来表示,因此,我使用List<byte>的聚集了整个流。

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

编辑:

进一步的评论这个答案,从Can UTF-8 contain zero byte?

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

因此,假设您收到一个零字节是NUL并且实际上不是代码点的一部分是安全的。

+1

如果UTF-8字符的最后一个字节是0x00,该怎么办?如在一个双字节(utf8编码)字符? 0状态的第1位没有任何跟随,然后你对解码字符的最后7位有7个0。 –

+1

@ColeJohnson这是一个很好的问题 - 我也很关心这个问题,但是从更一般的意义上说,例如,在四字节字符中出现的第二个或第三个字节是“0x00”。根据http://en.wikipedia.org/wiki/UTF-8(描述部分),它看起来像一个多字节字符不会包含零字节。 –

0

您可以尝试使用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)); 
} 
+0

不是什么OP特别问,但我喜欢它 –

相关问题