如何抑制 QString 中的 unicode 字符或转换为 latin1
How to suppress unicode characters in QString or convert to latin1
正在尝试将一些数据从 CSV 插入 Qt 中的 Firebird table。 DB 在 ASCII 中。插入一些带有非 ascii 符号的字符串时出现错误:
Cannot transliterate character between character sets
设置 QSqlDatabase::setConnectOptions("ISC_DPB_LC_CTYPE=UTF8;")
并将列转换为 UTF8 (CHARACTER SET UTF8
) 没有帮助 - 同样的错误。尝试抑制 unicode 字符也没有运气:
QTextCodec *codec = QTextCodec::codecForName("latin1");
QByteArray encodedString = codec->fromUnicode(str);
str = QString(encodedString);
QString::toLatin1 ()
也不会抑制字符。这里有什么解决方案?
这段代码应该可以满足您的需求:
QString h("Honkäüö?ß#asdfe");
unsigned char * data = (unsigned char*)h.data();
QString result;
for(int i = 0; h.size()*2; i+=2) {
if(data[i] > 127) {
result.append("?");
} else {
result.append(QChar(data[i]));
}
}
这是另一个更强大的版本:
QString h("Honkäüö?ß#asdfe");
QString result;
for(int i = 0; i < h.size(); ++i) {
QChar qc = h.at(i);
unsigned char c = *(unsigned char*)(&qc);
if(c >= 127) {
result.append("?");
} else if (QChar(c).isPrint()) {
result.append(QChar(c));
}
}
QString result
只是用来显示提取的内容。您可以将 data[i]
复制到 char
数组中或附加到 QByteArray
.
result
是 Honk?????????#asdfe
这适用于 16 位字符。 32 位字符导致额外的 '?' 或其他字符。
此代码从 qstring(16 或 32 位)中提取任何 unicode(表情符号)并且 toReturn 仅包含来自 ASCII 的字符table(unicode 值小于 256)
QString cleanQString(QString toClean) {
QString toReturn="";
for(int i=0;i<toClean.size();i++){
if(toClean.at(i).unicode()<256){
toReturn.append(toClean.at(i));
}
}
return toReturn;
}
正在尝试将一些数据从 CSV 插入 Qt 中的 Firebird table。 DB 在 ASCII 中。插入一些带有非 ascii 符号的字符串时出现错误:
Cannot transliterate character between character sets
设置 QSqlDatabase::setConnectOptions("ISC_DPB_LC_CTYPE=UTF8;")
并将列转换为 UTF8 (CHARACTER SET UTF8
) 没有帮助 - 同样的错误。尝试抑制 unicode 字符也没有运气:
QTextCodec *codec = QTextCodec::codecForName("latin1");
QByteArray encodedString = codec->fromUnicode(str);
str = QString(encodedString);
QString::toLatin1 ()
也不会抑制字符。这里有什么解决方案?
这段代码应该可以满足您的需求:
QString h("Honkäüö?ß#asdfe");
unsigned char * data = (unsigned char*)h.data();
QString result;
for(int i = 0; h.size()*2; i+=2) {
if(data[i] > 127) {
result.append("?");
} else {
result.append(QChar(data[i]));
}
}
这是另一个更强大的版本:
QString h("Honkäüö?ß#asdfe");
QString result;
for(int i = 0; i < h.size(); ++i) {
QChar qc = h.at(i);
unsigned char c = *(unsigned char*)(&qc);
if(c >= 127) {
result.append("?");
} else if (QChar(c).isPrint()) {
result.append(QChar(c));
}
}
QString result
只是用来显示提取的内容。您可以将 data[i]
复制到 char
数组中或附加到 QByteArray
.
result
是 Honk?????????#asdfe
这适用于 16 位字符。 32 位字符导致额外的 '?' 或其他字符。
此代码从 qstring(16 或 32 位)中提取任何 unicode(表情符号)并且 toReturn 仅包含来自 ASCII 的字符table(unicode 值小于 256)
QString cleanQString(QString toClean) {
QString toReturn="";
for(int i=0;i<toClean.size();i++){
if(toClean.at(i).unicode()<256){
toReturn.append(toClean.at(i));
}
}
return toReturn;
}