如何抑制 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.

resultHonk?????????#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;


}