Убедитесь, что std :: cin / cout может принимать и отображать символы не ascii
Проверьте, может ли код принимать и отображать символы не ascii:
std::string input;
std::getline(std::cin, input);
std::cout << input;
Если вы не В самой консоли не должно быть проблем с символами, отличными от ascii
Вам необходимо:
- Знать, в какой кодировке данные изначально поступают из консоли в
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 и наборах символов (без оправданий!)