Как преобразовать строку Юникода в ее экранирование? - PullRequest
4 голосов
/ 09 июля 2010

Скажите, что у меня есть текст "Բարև Hello Здравствуй". (Я сохраняю этот код в QString, но если вы знаете другой способ сохранить этот текст в коде c ++, вы можете это приветствовать.) Как я могу преобразовать этот текст в экранирование Unicode, например: \ u1330 \ u1377 \ u1408 \ u1415 Здравствуйте \ u1047 u1088 u1089 u1090 u1091 (см. здесь )?

Ответы [ 6 ]

5 голосов
/ 09 июля 2010
#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, а не по фактическим кодовым точкам.

3 голосов
/ 09 июля 2010

Я предполагаю, что вы делаете генерацию кода (из JavaScript, может быть?)

QString как коллекция QChar. Переберите содержимое и на каждом QChar вызовите метод unicode, чтобы получить значение ushort (16-разрядное целое).

Затем отформатируйте каждый символ как "\\u%04X", то есть \u, за которым следует шестнадцатеричное 4-значное значение.

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

2 голосов
/ 11 октября 2011
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;
}
1 голос
/ 09 июля 2010

Я решил проблему с этим кодом:

РЕДАКТИРОВАНИЕ В ЛУЧШУЮ ВЕРСИЮ: (Я просто не хочу преобразовывать латинские символы в 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 для кодировки текстового редактора.

0 голосов
/ 02 июля 2016

Мое решение:

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
0 голосов
/ 09 июля 2010

Вы должны сначала определить, какая кодировка используется для текста "Բարև Hello Здравствуй", выглядит как русский, может быть Win Code Code Page 1251. ИЛИ UTF-8 или что-то еще.Затем используйте оконную функцию MultiByteToWideChar с необходимыми входными данными, такими как прикладная кодовая страница, OriginalName и т. Д.

Надеюсь, это поможет.

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