搜索
查看: 6205|回复: 7

请问如何把utf8编码的网页源码存入sqlite数据库?

[复制链接]

6

主题

36

帖子

572

积分

培训班

积分
572
发表于 2013-11-6 10:23:38 | 显示全部楼层 |阅读模式
想要实现的目的就是把utf8编码的网页源码存入sqlite数据库。
现在遇到了乱码的问题:存入数据库查看会乱码,保存成html也会出现乱码。

我问了身边的懂电脑的,他说可能是aardio不支持utf8格式,我觉得不是这个原因,但现在还没找到怎么解决乱码的问题。
我在论坛搜索了相关帖子,不知道如何解决,才来提问,希望大家给指点一下,提供一下思路就好。
非常感谢关注!

下面是测试代码:

  1. io.open();//打开控制台
  2. import sqlite;
  3. import inet.whttp;

  4. //创建测试数据库和表
  5. var db =sqlite("\test.db") ;
  6. if(!db.existsTable("oald8")){
  7. db.exec("create table oald8 (oald8_pagecode)")       
  8. }

  9. function getPageCode(url){//获取网页源码函数
  10. var whttp =inet.whttp() ;
  11. whttp.setTimeouts(3000,3000,3000)
  12. var pageCode =whttp.get(url) ;
  13. //这里要进行编码转换吗?
  14. //string.fromto(pageCode)
  15. return pageCode;        
  16. }

  17. code=getPageCode("http://oald8.oxfordlearnersdictionaries.com/dictionary/take")

  18. //存到sqlite数据库
  19. db.prepare("insert into [oald8] values (@oald8_pagecode);").step(
  20. oald8_pagecode=code;
  21. )

  22. db.close();
  23. execute("pause") //按任意键继续
  24. io.close();//关闭控制台
复制代码

回复

使用道具 举报

9

主题

462

帖子

2551

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2551
发表于 2013-11-6 16:14:12 | 显示全部楼层

aardio里字符串是二进制的,而编码是纯文本里才有的概念,所以aardio理论上可以支持各种编码, 而且也提供了 string.fromto() 函数可以自

aardio里字符串是二进制的,而编码是纯文本里才有的概念,所以aardio理论上可以支持各种编码,
而且也提供了 string.fromto() 函数可以自由转换编码。

界面上,web.form, web.layout 都是支持UTF8的,而sqlite默认就使用UTF8编码。
sqlite里有两种数据类型,一是纯文本,二是二进制数据,而这两种数据在aardio里都是字符串。
纯文本是以UTF8存储的,但你这样传进去有问题,因为他并不知道你传进去的编码是什么,aardio自作聪明做了多余的转换,结果你就乱码了。

所以你用blob二进制的格式存进去就可以了,原样存取不需要考虑编码的问题。
  1. import sqlite;
  2. import inet.whttp;
  3. import web.form;
  4. import win.ui;
  5. /*DSG{{*/
  6. var winform = win.form( bottom=399;right=599;text="Web Form")
  7. /*}}*/
  8. var wb = web.form( winform  );
  9. wb.noScriptErr=true;
  10. winform.show()

  11. //创建测试数据库和表
  12. var db = sqlite("\test.db") ;
  13. if(!db.existsTable("oald8")){
  14.         db.exec("create table oald8 (html)")       
  15. }

  16. function getPageCode(url){//获取网页源码函数
  17.         var whttp = inet.whttp() ;
  18.         whttp.setTimeouts(3000,3000,3000)
  19.         var pageCode =whttp.get(url) ;  
  20.         return pageCode;        
  21. }

  22. var code = getPageCode("http://oald8.oxfordlearnersdictionaries.com/dictionary/take")
  23. var command = db.prepare("insert into [oald8] values (@html);");
  24. command.bind.blob(code)
  25. command.step()

  26. wb.html = db.stepQuery("select * from [oald8]").html;
  27. winform.show()
  28. win.loopMessage();  
  29. db.close();
复制代码


没有乱码,HTML是什么编码都可以支持。
回复

使用道具 举报

9

主题

462

帖子

2551

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2551
发表于 2013-11-6 16:18:00 | 显示全部楼层

[align=left][font=新宋体] 另外给你一个小建议: [quote][color=#0000ff]var[/color][color=#0000

另外给你一个小建议:
var db
这种双字母的变量尽量少用,变量含义不清代码一多看上去会很乱。可以改成 dbPages 或者 dbConn , dbSqlite 等等。
一个程序里单字母变量应当搬着五个手指头能数出来,双字母变量应当搬着十个手指头能数出来。
回复

使用道具 举报

6

主题

36

帖子

572

积分

培训班

积分
572
 楼主| 发表于 2013-11-6 16:29:03 | 显示全部楼层

[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=62716&ptid=11147][c

roger 发表于 2013-11-6 16:14
aardio里字符串是二进制的,而编码是纯文本里才有的概念,所以aardio理论上可以支持各种编码,
而且也提供了 ...

problem solved!
非常感谢roger版主!
不仅讲了怎么做,还解释了原因,真的很有帮助。
回复

使用道具 举报

6

主题

36

帖子

572

积分

培训班

积分
572
 楼主| 发表于 2013-11-6 16:31:09 | 显示全部楼层

[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=62717&ptid=11147][c

roger 发表于 2013-11-6 16:18
另外给你一个小建议:
这种双字母的变量尽量少用,变量含义不清代码一多看上去会很乱。可以改成 dbPages  ...

收到您的建议,并且看了您的代码,更清晰。
再次感谢!
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13973
发表于 2013-11-10 18:34:26 | 显示全部楼层

新版sqlite库增加了一个功能: 自动绑定命名参数时可选使用blob,utf8,utf16等名字前缀定义存储方式,下面是演示:[code][lang=aar

新版sqlite库增加了一个功能:
自动绑定命名参数时可选使用blob,utf8,utf16等名字前缀定义存储方式,下面是演示:

  1. import sqlite

  2. var sqlConnection = sqlite(":memory:")
  3. if( not sqlConnection.existsTable("stringTable") ){  
  4.         sqlConnection.exec( "create table stringTable(blobString,utf8String,utf16String);")  
  5. }  
  6.   
  7. sqlConnection.prepare("insert into stringTable values (@blobString,@utf8String,@utf16String);" ).step(
  8.         blobString = "指定以blob类型存储的二进制字符串";
  9.         utf8String = string.fromto("UTF8编码的字符串",0,65001);
  10.         utf16String = string.toUnicode("UTF16编码的字符串");       
  11. )
  12.   
  13. io.open();
  14. for rowid,blobString,utf8String,utf16String in sqlConnection.each("select rowid,* from stringTable") {
  15.         io.print( rowid,blobString,utf8String,utf16String )
  16. }


复制代码
回复

使用道具 举报

6

主题

36

帖子

572

积分

培训班

积分
572
 楼主| 发表于 2013-11-13 09:58:38 | 显示全部楼层

[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=62869&ptid=11147][c

Jacen 发表于 2013-11-10 18:34
新版sqlite库增加了一个功能:
自动绑定命名参数时可选使用blob,utf8,utf16等名字前缀定义存储方式,下面 ...

非常感谢Jacen!这样更加简便。
我的问题也可以用下面代码来实现:
  1. import sqlite;
  2. import inet.whttp;
  3. import web.form;
  4. import win.ui;
  5. /*DSG{{*/
  6. var winform = ..win.form( right=599;text="Web Form";bottom=399 )
  7. winform.add(  )
  8. /*}}*/

  9. var wb = web.form( winform  );
  10. wb.noScriptErr=true;
  11. winform.show()

  12. //创建测试数据库和表
  13. var dbOxford = sqlite("\test.db") ;
  14. if(!dbOxford.existsTable("oald8")){
  15.         dbOxford.exec("create table oald8 (html)")       
  16. }

  17. function getPageCode(url){//获取网页源码函数
  18.         var whttp = inet.whttp() ;
  19.         whttp.setTimeouts(3000,3000,3000)
  20.         var pageCode =whttp.get(url) ;  
  21.         return pageCode;        
  22. }

  23. var code = getPageCode("http://oald8.oxfordlearnersdictionaries.com/dictionary/a-e")
  24. dbOxford.prepare("insert into [oald8] values (@blobHtml);").step(//也就是说命名参数只要是blob开头aardio就会二进制存储到sqlite里了,依次类推utf8等
  25.         blobHtml=code
  26. )

  27. wb.html = dbOxford.stepQuery("select * from [oald8]").html;
  28. winform.show()
  29. win.loopMessage();  
  30. dbOxford.close();
复制代码
回复

使用道具 举报

9

主题

462

帖子

2551

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2551
发表于 2014-4-20 20:04:16 | 显示全部楼层

[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=65652&ptid=11147][c

leonchina 发表于 2014-4-20 18:12
您好,我是在寻找自己遇到的问题的解决办法的时候看到您的回帖的。可以花您一点时间帮我解决下吗?我的 ...

抱歉,因为你的代码不完整,今天暂时没时间仔细看,下次请提供复制可运行的代码。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-10-21 22:30 , Processed in 0.062500 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表