如何将unicode字符串转换为unicode转义?

时间:2010-07-09 09:02:12

标签: c++ qt unicode

说我有一个文字“ԲարեւHelloЗдравствуй”。 (我将此代码保存在QString中,但是如果您知道以c ++代码存储此文本的其他方式,那么欢迎您。)如何将此文本转换为Unicode转义符,例如“\ u1330 \ u1377 \ u1408 \ u1415 Hello \ u1047 \ u1076 \ u1072 \ u1072 \ u1089 \ u1090 \ u1074 \ u1091 \ u1081“(见here)?

6 个答案:

答案 0 :(得分:5)

#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代码单元,而不是实际的代码点。

答案 1 :(得分:3)

我假设您正在进行代码生成(可能是JavaScript?)

QString就像是QChar的集合。循环遍历内容,并在每个QChar上调用unicode方法以获取ushort(16位整数)值。

然后格式化每个字符,例如"\\u%04X",即\u,后跟4位十六进制值。

NB。您可能需要交换两个字节(两个十六进制字符)以获得正确的结果,具体取决于您运行的平台。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

我用这段代码解决了这个问题:

编辑更好的版本:(我只是不想将拉丁符号转换为Unicode,因为它会消耗额外的空间而没有我的问题并且有优势(想要提醒我想生成Unicode RTF)。)。 p>

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。

答案 4 :(得分:0)

您必须首先确定哪个编码用于文本“ԲարեւHelloЗдравствуй”,看起来像俄语,可能是Win Code Page 1251.或UTF-8或其他。 然后使用窗口函数MultiByteToWideChar和所需的输入,例如Applied Code页面,OriginalName等。

希望它有所帮助。

答案 5 :(得分:0)

我的解决方案:

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