2012-11-15 45 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特別問,但我喜歡它 –

相關問題