Как преобразовать строку Юникода в ее экранирование?
Скажем, у меня есть текст "Բարև Hello Здравствуй". (Я сохраняю этот код в QString, но если вы знаете другой способ сохранить этот текст в коде C++, вы можете это приветствовать.) Как я могу преобразовать этот текст в экранирование Unicode, например: "\u1330\u1377\u1408\u1415 Hello \u1047 u1088 u1089 u1091 u1091 (см. здесь)?
6 ответов
Я решил проблему с этим кодом:
РЕДАКТИРОВАНИЕ В ЛУЧШУЮ ВЕРСИЮ: (Я просто не хочу конвертировать латинские символы в Unicode, потому что это потребует дополнительного пространства без преимущества для моей проблемы (хочу напомнить, что я хочу генерировать Unicode RTF)).
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
QString str(QWidget::tr("Բարև (1-2+3/15,69_) Hello {} [2.63] Здравствуй"));
QString strNew;
QString isAcsii;
QString tmp;
foreach(QChar cr, str)
{
if(cr.toAscii() != QChar(0))
{
isAcsii = static_cast<QString>(cr.toAscii());
strNew+=isAcsii;
}
else
{
tmp.setNum(cr.unicode());
tmp.prepend("\\u");
strNew+=tmp;
}
}
QMessageBox::about(0,"Unicode escapes!",strNew);
return app.exec();
}
Спасибо @Daniel Earwicker за алгоритм и, конечно, +1.
Кстати, вам нужно указать UTF-8 для кодировки текстового редактора.
#include <cstdio>
#include <QtCore/QString>
#include <QtCore/QTextStream>
int main() {
QString str = QString::fromWCharArray(L"Բարև Hello Здравствуй");
QString escaped;
escaped.reserve(6 * str.size());
for (QString::const_iterator it = str.begin(); it != str.end(); ++it) {
QChar ch = *it;
ushort code = ch.unicode();
if (code < 0x80) {
escaped += ch;
} else {
escaped += "\\u";
escaped += QString::number(code, 16).rightJustified(4, '0');
}
}
QTextStream stream(stdout);
stream << escaped << '\n';
}
Обратите внимание, что это циклы по кодовым единицам UTF-16, а не по фактическим кодовым точкам.
Я предполагаю, что вы делаете генерацию кода (JavaScript, может быть?)
QString
это как коллекция QChar
, Переберите содержимое и на каждом QChar
позвонить unicode
способ получить ushort
(16-разрядное целое) значение.
Затем отформатируйте каждый символ как "\\u%04X"
т.е. \u
сопровождаемый 4-значным шестнадцатеричным значением.
NB. Возможно, вам придется поменять местами два байта (два шестнадцатеричных символа), чтобы получить правильный результат в зависимости от платформы, на которой вы работаете.
wchar_t *input;
wstring output;
for (int i=0; i<str_len; i++)
{
wchar_t code[7];
swprintf(code, 7, L"\\u%0.4X",input[i]);
output += code;
}
Мое решение:
std::wstring output;
QString result;
QTextCodec::setCodecForLocale ( QTextCodec::codecForName ( "UTF-8" ) );
for( uint i = 0; wcslen( input ) > i; ++i )
{
if( isascii( input[ i ] ) )
{
output.reserve( output.size() + 1 );
output += input[ i ];
} else {
wchar_t code[ 7 ];
swprintf( code, 7, L"\\u%0.4X", input[ i ] );
output.reserve( output.size() + 7 ); // "\u"(2) + 5(uint max digits capacity)
output += code;
}
}
result.reserve( output.size() );
result.append( QString::fromStdWString( output ) );
Работает с русским языком правильно. Трансформации
hello
привет
в
hello
\\u043F\\u0440\\u0438\\u0432\\u0435\\u0442
Вы должны сначала определить, какая кодировка используется для текста "Բարև Hello Здравствуй", выглядит как русский, может быть Win Code Page 1251. ИЛИ UTF-8 или что-то еще. Затем используйте оконную функцию MultiByteToWideChar с необходимыми входными данными, такими как прикладная кодовая страница, OriginalName и т. Д.
Надеюсь, поможет.