2011-05-17 97 views
9

对于这段代码:字符编码

String content = String.Empty; 
ListenerStateObject state = (ListenerStateObject)ar.AsyncState; 
Socket handler = state.workSocket; 

int bytesRead = handler.EndReceive(ar); 

if (bytesRead > 0) 
{ 
    state.sb.Append(Encoding.UTF8.GetString(state.buffer, 0, bytesRead)); 

    content = state.sb.ToString(); 
    ... 

我歌厅 '011?'而不是'Olá'

它有什么问题?

+4

您的数据可能不是UTF8。 – driis 2011-05-17 11:50:04

+0

更好地显示state.buffer的确切内容,并且bytesRead – 2011-05-17 14:19:03

回答

1

您确定该流实际上是utf-8编码吗?尝试在编码之前检查缓冲区中的原始字节(应该有4),看看实际的字节值是什么。

+0

'á'的值是63,所以这就是它显示'?'的原因。 – RedEagle 2011-05-17 12:00:23

+0

@RedEagle:*编码之前的字节是63 *吗?然后你的程序正常工作,因为输入真的是“Ol?”,但是流到达你的代码之前就被破坏了。 – JacquesB 2011-05-17 12:48:33

+0

事实证明这个流是ASCII编码而不是UTF-8,尽管我完全相信它已经是了。 感谢您的帮助回复 – RedEagle 2011-05-21 12:24:51

4

很有可能是错误的编码。

但是,如果您使用此代码来接收字节块(按协议分割),则会产生严重缺陷:无法保证块是独立编码的。

简单情况:2个块的边界切穿多字节编码字符。

最佳解决方案:将TextReader附加到流中。

-1

您是否将结果输出为了解“复杂”编码的内容?

+0

结果是一个.NET字符串,没有编码/复杂的关于它。 – 2011-05-17 12:28:04