尝试在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 ()
也不会抑制字符。可以在这里找到什么解决方案?
答案 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
。
result
是Honk?????????#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;
}