0

试图将一些数据从 CSV 插入 Qt 中的 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 ()也不会抑制字符。这里有什么解决方案?

4

2 回答 2

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

于 2015-12-02T09:19:55.520 回答
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;


}
于 2020-07-01T01:53:57.953 回答