wxsqlite3为什么读取中文时值为空呢? Topic is solved

这是wxWidgets论坛的中文版本。在这里,您可以用您的母语汉语讨论上面任一子论坛所涉及的所有关于wxWidgets的话题。欢迎大家参与到对有价值的帖子的中英互译工作中来!
samsam598
Super wx Problem Solver
Super wx Problem Solver
Posts: 340
Joined: Mon Oct 06, 2008 12:55 pm

Re: wxsqlite3为什么读取中文时值为空呢?

Post by samsam598 »

ywq111 wrote:2.8是以前下的,另外足够下。
其实也没啥,我现在是练练手。 等真正做研发的时候,用最新的。 :D

话说,以前没怎么学C++,有.net研发经历,不知道wxwidgets的内存问题怎么处理,会自动释放还是需要自己处理内存。
这块哪里有资料没?另外,怎么样在这块上手呢?

webkit,做浏览器用的吗? 暂时也这种需求。
用WX意味着用C++,C++ guru们认为C++(C)不同于其它,牛于其它语言的最突出的一点就是象上帝一样操作内存.所以俺觉得
基本功是最大的学习制高点,天资平庸如俺总是觉得基本功太差.

关于wx内存管理,还是推荐Julian Smart的那本书Cross Platform Programming With WxWidgets,第十五章.中英版到处都有得下.
Regards,
Sam
-------------------------------------------------------------------
Windows 10 64bit
VS Community 2019
msys2-mingw13.2.0 C::B character set: UTF-8/GBK(Chinese)
wxWidgets 3.3/3.2.4 Unicode Mono Static gcc static build
ywq111
Earned a small fee
Earned a small fee
Posts: 15
Joined: Tue Aug 21, 2012 12:27 pm

Re: wxsqlite3为什么读取中文时值为空呢?

Post by ywq111 »

makefile我倒是有点会修改了,稍会一点了。就是不怎么会编程。 :(
多谢指教,我多编译一种看看。
我那个默认编译的,确实没有那个文件。
居然可以有附件?
我以为不可以上传附件呢。。。 :D
kipade
Earned some good credits
Earned some good credits
Posts: 126
Joined: Fri Nov 11, 2011 2:45 am
Location: China

Re: wxsqlite3为什么读取中文时值为空呢?

Post by kipade »

我在Linux下试了,没有问题
wx版本2.9.4, wxSqlite3的版本3.3.0
wx的编译选项--with-gtk=3
(我机器装gtk3了)
然后,编译wxSqlite3的时候用直接用./configure29(如果和我一样使用gtk3的话,需要修改此脚本,加入WX_GTKOPT3选项即可,照WX_GTKOPT2的弄法)
建议楼主单步跟踪,查看内存
Slackware GNU/Linux x86_64
wxWidgets-3.3.0
ywq111
Earned a small fee
Earned a small fee
Posts: 15
Joined: Tue Aug 21, 2012 12:27 pm

Re: wxsqlite3为什么读取中文时值为空呢?

Post by ywq111 »

kipade wrote:我在Linux下试了,没有问题
wx版本2.9.4, wxSqlite3的版本3.3.0
wx的编译选项--with-gtk=3
(我机器装gtk3了)
然后,编译wxSqlite3的时候用直接用./configure29(如果和我一样使用gtk3的话,需要修改此脚本,加入WX_GTKOPT3选项即可,照WX_GTKOPT2的弄法)
建议楼主单步跟踪,查看内存
我发现在windows下用sqlite3.exe自己导入生成的sqlite3数据库,然后读取时是空。
但是如果在wxsqlite3中直接用insert语句插入的,则可以读取。

比如同一个数据库,我用sqlite3.exe插入一条中文记录,此记录读取出来是空;同时使用wxsqlite3插入一条中文记录,wxsqlite3插入的能读取成功:
sqlite3.exe插入的记录,用sqlite3.exe查询是中文;但wxsqlite3插入的那条则显示为乱码。。。

到底怎么使用sqlite3呢?我有些迷糊了。同一个数据库,使用pragma encoding 语句查询显示为utf-8呀 。。。

:(
ywq111
Earned a small fee
Earned a small fee
Posts: 15
Joined: Tue Aug 21, 2012 12:27 pm

Re: wxsqlite3为什么读取中文时值为空呢?

Post by ywq111 »

原因已经找到。

windows下:
sqlite3.exe 导入数据的时候,导入的来源CSV需要是utf-8的;否则,在sqlite3.exe中查询可以显示,但wxsqlite3读取则为空值。
导入的来源CSV是UTF-8时,WXSqlite3可以正常读取,但是使用sqlite3.exe查询则显示乱码。


以下是自己做的笔记【sqlite3导库与wxsqlite3中文相关】

Code: Select all

先运行如下命令创建数据库:
sqlite3.exe zl.db

创建数据表TDayInfo:
如格式为:GL(公历),ZL(藏历),Info(提示信息),以GL(公历)为主键

创建的相关的sql语句:
PRAGMA encoding="UTF-8";PRAGMA foreign_keys=OFF;

CREATE TABLE "TDayInfo" (
"GL"  TEXT NOT NULL,
"ZL"  TEXT,
"Info"  TEXT,
PRIMARY KEY ("GL" ASC)
);

设置模式的命令为:
.mode csv  (或者使用“ .separator "," ”指定分隔符为英文逗号)

导入数据说明:
其中rq.csv是以逗号分隔的csv文件,总共三行,包含中文字段,可从access中导出,或者从直接用文本编辑器编辑。
如需在wxsqlite3中使用,则rq.csv必须保存成utf-8编码——导入rq.csv后使用sqlite3.exe查询为乱码,但是使用wxsqlite3访问则可正常显示中文。
如rq.csv是ASCII编码,那么导入后,使用sqlite3.exe查询正常显示中文,但使用wxsqlite3访问则查出来为空值。


导入的命令为:
.import rq.csv TDayInfo
导入完成后就可以使用了。

退出命令:
.exit

Attachments
sqlite3DaoKu.zip
SQLite3导库与wxSqlite3中文相关
(279.37 KiB) Downloaded 570 times
maryjeck
In need of some credit
In need of some credit
Posts: 4
Joined: Mon Jan 27, 2014 10:45 am

Re: wxsqlite3为什么读取中文时值为空呢?

Post by maryjeck »

ywq111 wrote:原因已经找到。

windows下:
sqlite3.exe 导入数据的时候,导入的来源CSV需要是utf-8的;否则,在sqlite3.exe中查询可以显示,但wxsqlite3读取则为空值。
导入的来源CSV是UTF-8时,WXSqlite3可以正常读取,但是使用sqlite3.exe查询则显示乱码。


以下是自己做的笔记【sqlite3导库与wxsqlite3中文相关】

Code: Select all

先运行如下命令创建数据库:
sqlite3.exe zl.db

创建数据表TDayInfo:
如格式为:GL(公历),ZL(藏历),Info(提示信息),以GL(公历)为主键

创建的相关的sql语句:
PRAGMA encoding="UTF-8";PRAGMA foreign_keys=OFF;

CREATE TABLE "TDayInfo" (
"GL"  TEXT NOT NULL,
"ZL"  TEXT,
"Info"  TEXT,
PRIMARY KEY ("GL" ASC)
);

设置模式的命令为:
.mode csv  (或者使用“ .separator "," ”指定分隔符为英文逗号)

导入数据说明:
其中rq.csv是以逗号分隔的csv文件,总共三行,包含中文字段,可从access中导出,或者从直接用文本编辑器编辑。
如需在wxsqlite3中使用,则rq.csv必须保存成utf-8编码——导入rq.csv后使用sqlite3.exe查询为乱码,但是使用wxsqlite3访问则可正常显示中文。
如rq.csv是ASCII编码,那么导入后,使用sqlite3.exe查询正常显示中文,但使用wxsqlite3访问则查出来为空值。


导入的命令为:
.import rq.csv TDayInfo
导入完成后就可以使用了。

退出命令:
.exit


其实没有这个麻烦,现在的sqlite3都是用utf8保存,而在wxsqlite处理的时候居然还要转换一次utf8,所以就读不出来了。。

那我们就不用GetString()的方法获取,用GetBlob()来获取。

wxSQLite3ResultSet myResultSet;
...............
Stmp =wxString(myResultSet.GetBlob(i,i_charlen));//这里就省去了内部转换,中文就能直接读取了。。。。。。
Post Reply