簡體   English   中英

如何通過Linux套接字將UTF-8文本放入std :: string

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM