[英]How to put UTF-8 text into std::string through linux sockets
我制作了一個簡單的C ++服務器程序,只要與諸如telnet之類的簡單工具一起使用它就可以正常工作,但是當我使用例如.Net(C#)來連接並發送一些字符串時,文本有點損壞了。 我在C#端嘗試了多種編碼,唯一的結果是它以不同的方式損壞了。
我相信主要問題在於此功能,該功能旨在從套接字讀取一行文本:
std::string Client::ReadLine()
{
std::string line;
while (true)
{
char buffer[10];
read(this->Socket, buffer, 9);
int i = 0;
while (i < 10)
{
if (buffer[i] == '\r')
{
i++;
continue;
}
if (buffer[i] == '\0')
{
// end of string reached
break;
}
if (buffer[i] == '\n')
{
return line;
}
line += buffer[i];
i++;
}
}
return line;
}
這是終端的簡單程序輸出,當我使用telnet將其發送為字符串“ en.wikipedia.org”時,我看到:
Subscribed to en.wikipedia.org
當我使用C#使用此代碼打開流編寫器時
streamWriter = new StreamWriter(networkStream, Encoding.UTF8);
我懂了:
Subscribed to en.wiki,pedia.org,
當我在沒有UTF-8的情況下使用它(以便使用默認的.net編碼時,IDK是什么)
streamWriter = new StreamWriter(networkStream);
我懂了:
Subscribed to en.wiki�pedia.org�
但是,在兩種情況下都是錯誤的。 僅使用標准C ++和linux庫,實現此目標的最簡單方法是什么? (無助推等-我可以使用某些框架來完成此操作,例如Qt,助推等,但我想了解這一點)。 完整代碼@ http://github.com/huggle/XMLRCS
UTF-8字符串只是一系列單字節,基本上應該由wnat std::string
處理。 您還有另外兩個問題:
第一個是您實際上不檢查實際讀取了多少個字符,而是始終循環十個字符。 因為您沒有循環讀取的實際字符數(並且不檢查錯誤或連接終止),所以您可能會讀取緩沖區中超出read
所寫內容的數據,並且行為不確定 。
第二個問題與第一個問題有關,那就是您有一個十個字符的緩沖區,您最多將九個字符讀入緩沖區,然后循環遍歷緩沖區中的所有十個字符。 問題在於,由於最多只能讀取9個字符,因此第十個字符將始終未初始化。 由於緩沖區中的第十個條目始終未初始化,因此其值將不確定,讀取該值將再次導致未定義的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.