sqlite中以GBK存的中文,在Linux环境的QT开发中QSqlQuery查询出来是乱码,需要如何转换,具体如何操作,谢

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlite中以GBK存的中文,在Linux环境的QT开发中QSqlQuery查询出来是乱码,需要如何转换,具体如何操作,谢相关的知识,希望对你有一定的参考价值。

我尝试加入
QTextCodec *codec = QTextCodec::codecForName("GBK");
QTextCodec::setCodecForTr(codec);
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);
以及query.value(0).toString()后加上.toUtf8()依旧是乱码,不过此时乱码能辨识部分正确中文,不知道是什么原因,请各位大大帮帮忙

参考技术A 最简单的办法就是你的程序脚本也是GBK编码追问

Linux中不是utf-8么?

追答

你说你好端端的把数据搞成GBK存进去干什么呢 不是浪费资源么

你再把数据转换成UTF-8编码不就可以了么

SQLITE默认是UTF-8 你搞成了GBK的 麻烦来了

追问

我只是要读取那个数据库,那个数据库别的程序还在用的,写入的数据编码就是GBK没办法去改,只能我QT这里做处理,悲剧,有什么好的建议么?

追答

QTextCodec里面增加函数 把读取的数据转换编码 其他没办法咯

本回答被提问者采纳
参考技术B python code:

def convert(o):
return o if not isinstance(o, (str,)) \
else o.decode('gbk').encode('utf-8')

def rowconvert(r):
return map(convert, r)

Linux下环境相关话题

一、设置语言环境

在Linux中通过locale来设置程序运行的不同语言环境,locale由 ANSI C提供支持。locale的命名规则为_.,如zh_CN.GBK,zh代表中文, CN代表大陆地区,GBK表示字符集。

locale分类:
语言符号及其分类(LC_CTYPE),数字 (LC_NUMERIC),比较和排序习惯(LC_COLLATE),时间显示格式(LC_TIME),货币单位(LC_MONETARY),信息主要是提示信息,错误信息, 状态信息, 标题, 标签, 按钮和菜单等(LC_MESSAGES),姓名书写方式(LC_NAME),地址书写方式(LC_ADDRESS),电话号码书写方式 (LC_TELEPHONE),度量衡表达方式(LC_MEASUREMENT),默认纸张尺寸大小(LC_PAPER)和locale对自身包含信息的概述(LC_IDENTIFICATION)。 
eg:$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"                    #用户所使用的语言符号及其分类
LC_NUMERIC="en_US.UTF-8"                #数字
LC_TIME="en_US.UTF-8"                      #时间显示格式
LC_COLLATE="en_US.UTF-8"                #比较和排序习惯
LC_MONETARY="en_US.UTF-8"             #LC_MONETARY
LC_MESSAGES="en_US.UTF-8"             #信息主要是提示信息,错误信息, 状态信息, 标题, 标签, 按钮和菜单等
LC_PAPER="en_US.UTF-8"                    #默认纸张尺寸大小
LC_NAME="en_US.UTF-8"                     #姓名书写方式
LC_ADDRESS="en_US.UTF-8"               #地址书写方式
LC_TELEPHONE="en_US.UTF-8"             #电话号码书写方式
LC_MEASUREMENT="en_US.UTF-8"        #度量衡表达方式
LC_IDENTIFICATION="en_US.UTF-8"      #对自身包含信息的概述
LC_ALL=

locale定义文件放在/usr/share/i18n/locales

字符集就是字符,尤其是非英语字符在系统内的编码方式,也就是通常所说的内码,所有的字符集都放在 /usr/share/i18n/charmaps,所有的字符集也都是用Unicode编号索引的。Unicode用统一的编号来索引目前已知的全部的符号。而字符集则是这些符号的编码方式,或者说是在网络传输,计算机内部通信的时候,对于不同字符的表达方式,Unicode是一个静态的概念,字符集是一个动态的概念,是每一个字符传递或传输的具体形式.

Locale 是软件在运行时的语言环境, 它包括语言(Language), 地域 (Territory) 和字符集(Codeset)。一个locale的书写格式为: 语言[_地域[.字符集]]. 
生成的locale放在/usr/lib/locale/目录中

自定义locale 

优先级的关系: 
LC_ALL>LC_*>LANG 
LC_ALL的值将覆盖所有其他的locale设定

查看zh_CN使用的编码:
/usr/lib/locale/zh_CN/LC_* 说明了使用何种编码

Linux 切换 locale 的四种方法
1) 从CDE登录屏幕上修改locale 
选择 options -> languages -> choose the new locale
2) 临时设置locale(shell相关的) 
ksh : LANG= 
sh : LANG= 
export LANG 
csh : setenv LANG 
bash: export LANG=en_US(zh.GBK)
3) vi /etc/default/init 
add 
LANG= 
LC_ALL= 
reboot。 
4) .cshrc/.profile/.bashrc: 设置$LANG
 

Linux Terminal对NLS的支持
前言:虽然通过setenv LANG/LC_ALL让Linux支持NLS界面,但是在Terminal中要显示NLS语言还需要设置Terminal的语言支持来显示命令行的结果显示。
网上搜索结果表明,KDE对NLS支持不是很好,KDE的Konsole找不到方便地设置语言的位置。但是GNOME的Terminal则很方便设置支持语言。

GNOME和KDE的切换
一、设置GNOME或者KDE为默认的启动桌面环境
方法1:修改/etc/sysconfig/desktop,根据需要将“DESKTOP”后面的内容改为KDE或GNOME。
方法2:在当前用户目录下建立“.xinitrc”这个文件(注意文件名前有一个点号,代表建立的是一个隐藏文件),
文件的内容就一行startkde或gnome-session,根据自己的需要选择KDE或GNOME。 
二、GNOME和KDE的切换(“#”后面为输入命令)
1.如果需要切换到GNOME:
#switchdesk gnome   
2.如果需要切换到KDE:
#switchdesk kde 

修改默认字符集
把default的字符集由utf-8改做GB2312,并 edit smb.conf,加入
[root@btirsvr31 ~]# more /etc/sysconfig/i18n 
#LANG="en_US.UTF-8"
#SUPPORTED="zh_CN.UTF-8:zh_CN:zh:en_US.UTF-8:en_US:en"
#SYSFONT="latarcyrheb-sun16"

LANG="zh_CN.GB18030"
SUPPORTED="zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en"
SYSFONT="latarcyrheb-sun16"

vsftpd.conf 字符集配置
charset_filter_enable=YES
charset_client=GBK
charset_server=UTF8


二|环境变量设置
1、总结背景
在linux系统下,如果你下载并安装了应用程序,很有可能在键入它的名称时出现“command not found”的提示内容。如果每次都到安装目标文件夹内,找到可执行文件来进行操作就太繁琐了。这涉及到环境变量PATH的设置问题,而PATH的设置也是在linux下定制环境变量的一个组成部分。本案例基于RedHat AS4讲解环境变量定制的问题。
2、变量简介
Linux是一个多用户的操作系统。每个用户登录系统后,都会有一个专用的运行环境。通常每个用户默认的环境都是相同的,这个默认环境实际上就是一组环境变量的定义。用户可以对自己的运行环境进行定制,其方法就是修改相应的系统环境变量。
3、定制环境变量
环境变量是和Shell紧密相关的,用户登录系统后就启动了一个Shell。对于Linux来说一般是bash,但也可以重新设定或切换到其它的Shell(使用chsh命令)。
根据发行版本的情况,bash有两个基本的系统级配置文件:/etc/bashrc和/etc/profile。这些配置文件包含两组不同的变量:shell变量和环境变量。前者只是在特定的shell中固定(如bash),后者在不同shell中固定。很明显,shell变量是局部的,而环境变量是全局的。环境变量是通过Shell命令来设置的,设置好的环境变量又可以被所有当前用户所运行的程序所使用。对于bash这个Shell程序来说,可以通过变量名来访问相应的环境变量,通过export来设置环境变量。
注:Linux的环境变量名称一般使用大写字母
4、环境变量设置实例
1)使用命令echo显示环境变量
本例使用echo显示常见的变量HOME
$ echo $HOME  
/home/kevin
2)设置一个新的环境变量
$ export MYNAME=”my name is kevin”
$ echo $ MYNAME
my name is Kevin
3)修改已存在的环境变量
接上个示例
$ MYNAME=”change name to jack”
$ echo $MYNAME
change name to jack
4)使用env命令显示所有的环境变量
$ env
HOSTNAME=localhost.localdomain
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000
SSH_CLIENT=192.168.136.151 1740 22
QTDIR=/usr/lib/qt-3.1
SSH_TTY=/dev/pts/0
……
5)使用set命令显示所有本地定义的Shell变量
$ set
BASH=/bin/bash
BASH_ENV=/root/.bashrc
……
6)使用unset命令来清除环境变量
$ export TEMP_KEVIN=”kevin”     #增加一个环境变量TEMP_KEVIN
$ env | grep TEMP_KEVIN          #查看环境变量TEMP_KEVIN是否生效(存在即生效)
TEMP_KEVIN=kevin #证明环境变量TEMP_KEVIN已经存在
$ unset TEMP_KEVIN            #删除环境变量TEMP_KEVIN
$ env | grep TEMP_KEVIN       #查看环境变量TEMP_KEVIN是否被删除,没有输出显示,证明TEMP_KEVIN被清除了。
7)使用readonly命令设置只读变量
注:如果使用了readonly命令的话,变量就不可以被修改或清除了。
$ export TEMP_KEVIN ="kevin"      #增加一个环境变量TEMP_KEVIN
$ readonly TEMP_KEVIN                  #将环境变量TEMP_KEVIN设为只读
$ env | grep TEMP_KEVIN          #查看环境变量TEMP_KEVIN是否生效
TEMP_KEVIN=kevin        #证明环境变量TEMP_KEVIN已经存在
$ unset TEMP_KEVIN          #会提示此变量只读不能被删除
-bash: unset: TEMP_KEVIN: cannot unset: readonly variable
$ TEMP_KEVIN ="tom"        #修改变量值为tom会提示此变量只读不能被修改
-bash: TEMP_KEVIN: readonly variable
8)通过修改环境变量定义文件来修改环境变量。
需要注意的是,一般情况下,仅修改普通用户环境变量配置文件,避免修改根用户的环境定义文件,因为那样可能会造成潜在的危险。
$ cd ~                                  #到用户根目录下
$ ls -a                                 #查看所有文件,包含隐藏的文件
$ vi .bash_profile                #修改用户环境变量文件
例如:
编辑你的PATH声明,其格式为:
PATH=$PATH:<PATH 1>:<PATH 2>:<PATH 3>:------:<PATH N>
你可以自己加上指定的路径,中间用冒号隔开。
环境变量更改后,在用户下次登陆时生效。
如果想立刻生效,则可执行下面的语句:$source .bash_profile
需要注意的是,最好不要把当前路径”./”放到PATH里,这样可能会受到意想不到的攻击。
完成后,可以通过$ echo $PATH查看当前的搜索路径。这样定制后,就可以避免频繁的启动位于shell搜索的路径之外的程序了。
5、学习总结
1)Linux的变量种类
按变量的生存周期来划分,Linux变量可分为两类:
a、永久的:需要修改配置文件,变量永久生效。
b、临时的:使用export命令行声明即可,变量在关闭shell时失效。
2)设置变量的三种方法
a、在/etc/profile文件中添加变量【对所有用户生效(永久的)】
用VI在文件/etc/profile文件中增加变量,该变量将会对Linux下所有用户有效,并且是“永久的”。
例如:编辑/etc/profile文件,添加CLASSPATH变量
# vi /etc/profile
export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
注:修改文件后要想马上生效还要运行# source /etc/profile不然只能在下次重进此用户时生效。
b、在用户目录下的.bash_profile文件中增加变量【对单一用户生效(永久的)】
用VI在用户目录下的.bash_profile文件中增加变量,改变量仅会对当前用户有效,并且是“永久的”。
例如:编辑guok用户目录(/home/guok)下的.bash_profile
$ vi /home/guok/.bash.profile
添加如下内容:
export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
注:修改文件后要想马上生效还要运行$ source /home/guok/.bash_profile不然只能在下次重进此用户时生效。
c、直接运行export命令定义变量【只对当前shell(BASH)有效(临时的)】
在shell的命令行下直接使用[export变量名=变量值]定义变量,该变量只在当前的shell(BASH)或其子shell(BASH)下是有效的,shell关闭了,变量也就失效了,再打开新shell时就没有这个变量,需要使用的话还需要重新定义。



以上是关于sqlite中以GBK存的中文,在Linux环境的QT开发中QSqlQuery查询出来是乱码,需要如何转换,具体如何操作,谢的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中以只读方式打开 SQLITE

如何在 sqlite3 中以 react native 创建数据库

如何在 iOS 中以编程方式将 sqlite 文件保存在本地文件夹或 nsbundle 中?

从 Android Studio 中的 SQLite 数据库中以字符串形式检索数据

解决linux环境tomcat下载文件404的问题(路径中文乱码)

Linux 环境下 javac 编译错误: 编码UTF8的不可映射字符 (编码UTF8/GBK的不可映射字符)