如何在QString中抑制unicode字符或转换为latin1

时间:2015-12-02 07:11:38

标签: qt unicode firebird qstring latin

尝试在Qt中将一些数据从CSV插入到Firebird表中。 DB是ASCII格式。插入一些带有非ascii符号的字符串时会出现错误:

  

无法在字符集之间音译字符

设置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 ()也不会抑制字符。可以在这里找到什么解决方案?

2 个答案:

答案 0 :(得分:1)

这段代码可以满足您的需求:

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位字符会产生额外的'?'或其他字符。

答案 1 :(得分:0)

此代码从qstring(16或32位)中提取所有unicode(表情符号),并且toReturn仅包含ASCII表中的字符(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;


}