2011-05-17 154 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