我有一个数据库字段,其字符串如“PRODUCT N°1”,当执行:
QString name = query.value(PRODUCT_INDEX_NAME).toString()
我得到:“产品N?1”。学位符号丢失了。
我认为是一个字符编码问题。怎么解决?
更多信息:
输出:
query.value(PRODUCT_INDEX_NAME).toByteArray()
是:
"PRODUCT N?1 " QByteArray
[0] 80 'P' char
[1] 82 'R' char
[2] 79 'O' char
[3] 68 'D' char
[4] 85 'U' char
[5] 67 'C' char
[6] 84 'T' char
[7] 32 ' ' char
[8] 78 'N' char
[9] 63 '?' char
[10]49 '1' char
如上所示,内部字符'°'已经转换为字节63('?'),因此尝试按照'webclectic'的建议,无论如何都不起作用。
答案 0 :(得分:2)
您可以使用QByteArray
中的值,然后使用正确的QTextCodec
将其转换为QString
。例如,如果编解码器是Windows-1250,您可以这样做:
QTextCodec* windows1250Codec = QTextCodec::codecForName("Windows-1250");
QString name =
windows1250Codec->toUnicode(query.value(PRODUCT_INDEX_NAME).toByteArray());
查看QTextCodec
documentation以获取更多信息以及可用编解码器列表。
答案 1 :(得分:1)
QString支持Unicode,而°(0xB0)是一个无效的UTF-8编码字节,用于字符代码的开始。
尝试在创建数据库时将数据库编码更改为UTF-8:
CREATE DATABASE mydb DEFAULT CHARACTER SET utf8
如果仍然无效,请尝试使用utf16。
但如果您无法修改数据库,则必须在Qt应用程序源代码中设置连接选项:
// db is the instance of QSqlDatabase
db.setConnectOptions("ISC_DPB_LC_CTYPE=Latin1");
但是Qt Visual Fox Pro驱动程序可能不支持此选项,因为ISC_DPB_LC_CTYPE用于InterBase,如http://doc.qt.io/archives/qt-4.7/sql-driver.html页面所示(请参阅§QIBASEUnicode支持和文本编码)。 我没有任何Visual Foxpro文档来查找字符编码的连接选项名称。