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