Как поместить текст UTF-8 в std :: string через сокеты linux

0

Я сделал простую C++ серверную программу, которая отлично работает, пока я использую ее с помощью простых инструментов, таких как telnet, однако, когда я использую, например,.NET (С#), который будет подключаться к нему и отправлять ему некоторые строки, текст немного испорчен. Я попробовал несколько кодировок на стороне С#, и только результат был в том, что он был поврежден по-другому.

Я верю, что основная проблема заключается в этой функции, предназначенной для чтения строки текста из сокета:

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;
}

Это простой вывод программы в терминал, когда я отправляю строку "en.wikipedia.org" с помощью telnet, я вижу:

Subscribed to en.wikipedia.org

Когда я использую С#, которые открывают запись потока, используя этот код

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, boost и т.д., но я хотел бы это понять). Полный код @http://github.com/huggle/XMLRCS

  • 0
    что будет, если вы используете std :: wstring?
  • 4
    Я думаю, что вы читаете в 9 символов, но копируете 10 символов из буфера.
Показать ещё 2 комментария
Теги:
encoding

1 ответ

2
Лучший ответ

Строка UTF-8 - это всего лишь серия одиночных байтов, в основном это просто wnat std::string. У вас есть еще две проблемы:

Во-первых, вы на самом деле не проверяете, что на самом деле было написано много символов, вы всегда занимаете десять символов. Поскольку вы не зацикливаете фактическое количество прочитанных символов (и не проверяете наличие ошибок или конец соединения), вы можете читать данные в буфере, кроме того, что было написано путем read и у вас есть неопределенное поведение.

Вторая проблема относится к первому, а именно к тому, что у вас есть буфер из десяти символов, вы считываете до девяти символов в буфер, а затем перебираете все десять символов в буфере. Проблема заключается в том, что, поскольку вы читаете только до девяти символов, десятый символ всегда будет неинициализирован. Поскольку десятая запись в буфере всегда неинициализирована, ее значение будет неопределенным, и его чтение снова приведет к неопределенному поведению.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню