Как отправить строку в utf-8 на сервер ir c? - PullRequest
0 голосов
/ 17 апреля 2020

У меня бот ir c, написанный на c ++ с использованием библиотеки Qt. Я храню консольный ввод текста в std :: string, а затем я использую QSocket, чтобы опубликовать его в чате ir c. Но проблема в том, что я хочу использовать специальные знаки (буквы sh), которые не отображаются должным образом в чате. В чем проблема? То, как я использую QSocketis:

void Socket::poster(const QByteArray send)    
{
    mSocket->write(send);
    mSocket->flush();
    mSocket->reset();
}

QByteArray, я создаю из std :: string и std :: cin

он длинный, поэтому я публикую только те части, которые важны для указанного c Сбой функции

Класс сокета (который является основным классом в программе, предоставляющей данные другим классам):

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
protected:
    QSslSocket *mSocket;
--------------------

    connect(mSocket, SIGNAL(readyRead()),
            this, SLOT(readyReady())
--------------------
//console input:
    QThread *thread = new QThread;
    consoleInput = new ConsoleInput();
    consoleInput->startConsole(thread, mSocket);
    consoleInput->moveToThread(thread);
    thread->start();

-------------------
void Socket::readyReady()
{
    QString data;
    data2 = data;
    mSocket->ReadOnly;
    while(mSocket->canReadLine())
    {
    data = mSocket->readLine();
    }
    mSocket->reset();
}


---------------------
void Socket::poster(const QByteArray send)   //sending to irc from many classes news, console itd
{
    mSocket->write(send);
    mSocket->flush();
    mSocket->reset();
}
-------------------
ConsoleInput class (which takes console input, which is later sent to irc chat):
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


void ConsoleInput::run()
{
    std::cout << "!ConsoleInput::run()" << "\n";

    while(1){
    std::string input;
    std::getline(std::cin, input);
    determineOption(input);

    if(input[0] != '/' || input[0] != '\\')
        postInput(input);

    input.clear();
    }
}


----------------------------------

void ConsoleInput::postInput(std::string &input)
{
    if(input[0]=='/')
        return; //this prevents bot poting "/command" to channel
    std::string lineToPost;

    std::cout << "!lineToPost - input " << input << "\n";
    ColourManipulation c;
    lineToPost = "PRIVMSG #grunge " + c.addColours(input) + "\r\n";
    emit mySignal(QByteArray::fromStdString(lineToPost)); // problem
}

1 Ответ

0 голосов
/ 18 апреля 2020

Убедитесь, что std :: cin / cout может принимать и отображать символы не ascii

Проверьте, может ли код принимать и отображать символы не ascii:

std::string input;
std::getline(std::cin, input);
std::cout << input;

Если вы не В самой консоли не должно быть проблем с символами, отличными от ascii

Вам необходимо:

  1. Знать, в какой кодировке данные изначально поступают из консоли в std::string &input.

std::string сам по себе тип не использует кодировку - он вернет введенные вами байты - Какую кодировку выполняет std :: string. c_str () использовать? .

Импорт байтов в QString с использованием необходимого преобразования кодировки

Экспорт полученного QString в кодировку UTF-8 QByteArray (QByteArray сам по себе является просто массивом байтов).

Запись QByteArray в сокет.


Вы можно написать что-то вроде следующего:

/*
From doc: QTextCodec::codecForLocale() 
Returns a pointer to the codec most suitable for this locale.
The codec will be retrieved from ICU where that backend is in use, 
otherwise it may be obtained from an OS-specific API. 
In the latter case, the codec's name may be "System".    
*/
QTextCodec *codec = QTextCodec::codecForLocale(); // In most cases, it is not UTF-8

// Or set the encoding explicitly:
//QTextCodec *codec = QTextCodec::codecForName("Shift-JIS"); // put your input encoding here

QTextDecoder *decoder = codec->makeDecoder();

QByteArray chunk = QByteArray::fromStdString(input);

QString string = decoder->toUnicode(chunk);
delete decoder;

emit mySignal(string.toUtf8());

Обратите внимание, что вы можете избежать std::string и использовать только QString:

QString более удобно , и, после правильного получения данных, он всегда хранит данные внутри одного и того же известного формата, несмотря на std::string, который не имеет представления, какие данные он хранит.

Как читать с консоли на QString напрямую:

QTextStream in(stdin);
in.setCodec(<your console codec>);

QString input = in.readLine();    

См. QTextCode c и QTextStream .

Читайте также Абсолютный минимум Каждый разработчик программного обеспечения должен абсолютно точно знать о Unicode и наборах символов (без оправданий!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...