Qt query.value返回错误的字符(char编码)

时间:2012-03-15 09:51:35

标签: database qt character-encoding

我有一个数据库字段,其字符串如“PRODUCT N°1”,当执行:

QString name = query.value(PRODUCT_INDEX_NAME).toString()

我得到:“产品N?1”。学位符号丢失了。

我认为是一个字符编码问题。怎么解决?

更多信息:

  • 数据库是Visual FoxPro(我不知道它的字符编码,可能是Windows-1252)
  • 通过QODBC
  • 执行查询
  • 在dos视图字符串中使用dbfViewer打开数据库时显示为“PRODUCT N | 1”,并在Windows视图中正确显示为“PRODUCT 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'的建议,无论如何都不起作用。

2 个答案:

答案 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文档来查找字符编码的连接选项名称。