搜索
查看: 1070|回复: 7

使用getUtf函数获取网页源码为何返回值为0?

[复制链接]

3

主题

6

帖子

28

积分

新手入门

Rank: 1

积分
28
发表于 2017-11-16 17:36:07 | 显示全部楼层 |阅读模式
上代码:
import console;
import string;
import inet.whttp;

var http = inet.whttp();

var s = http.get('http://www.weibo.com')
console.log(type(s))
console.log(string.getUtf(s))
console.pause(true);

网页返回内容为string  getUtf返回值为0

附上手册中对getUtf的解释

string.getUtf(__)
获取字符串的UTF格式标记,返回值如下:
&&16 表示双字节编码的UTF-16编码
&&8 表示UTF-8字符串,
&&(8 | 1) 表示UTF-8、ANSI兼容编码,即所有字符小于0x80




问题
1:返回值为0应该如何理解?
2:utf格式标记 这个词应该如何理解?
回复

使用道具 举报

186

主题

2542

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2017-11-16 18:41:16 | 显示全部楼层
关于这个可以看一下帮助手册里字符串类型的说明,
之前我在aardio10发布的帖子里也有详细解释。

aardio通过UTF标记自动识别字符串是否一个明确定义为UTF8、或UTF16的字符串(这包括在代码中定义字符串,或者某些字符串函数明确指定了来源是某种UTF编码),aardio也可以自动识别字符串是否一个使用编码转换函数转换为UTF8,UTF16,或ANSI编码的字符串。

通过这种机制aardio在需要的时候实现编码自动转换(例如调用Unicode API时自动识别UTF8,UTF16编码),并且避免多余不必要的重复转换以优化性能。但这是aardio的一种内部机制,原则上用户不应该去检测、判断、或者设置UTF标记

UTF标记并不是用来主动检测文本编码的( 也没有办法检测 )。
aardio只要在能确认一个字符串的编码格式时才会对字符串进行标记,对于无法确定来源的字符串他的UTF标记都是0,这时候aardio假定他是UTF8字符串。但这跟明确标明为UTF8的字符串是有区别的,例如你试图把一个字符串转换为UTF8, aardio会先查看字符串的UTF8标记,如果源字符串已经带有UTF8标记 - aardio会自动做出正确的选择修正编码或者避免不必要的转换,但如果UTF标记是0 - 他会按你的选择去做一次编码转换。

所以对于 string.getUtf, string.setUtf这些函数我的建议是:
任何时候都不要去使用(除非确实理解了其原理,并确认有必要这么做

参考文档中的介绍:
aardio代码中双引号、反引号内的都是纯文本字符串,并被aardio标记为UTF-8编码。
aardio中每个字符串都有一个UTF格式标记,可以使用 string.getUtf() , string.setUtf() 函数获取或修改UTF标记。UTF标记是按位设置的,utf & 8 表示一个UTF8编码的字符串,utf & 16表示一个UTF16编码的Unicode字符串。而UTF & 1 表示一个ANSI字符串,

用户在编写程序中一般不应去获取或修改该UTF标记,该格式标记应由aardio自动维护,用于优化自动编码转换的效率。用户应当明确的了解一个文本的来源编码,并且有有需要时使用string.fromto()等转换函数进行编码转换。aardio只要在能确认一个字符串的编码格式时才会对字符串进行标记(例如:直接写在aardio源码中的字符串字面值,或者经过string.fromto函数成功转换编码的字符串)。
九、新的字符串UTF标记规则。

这是在aardio 9中新增的机制,但aardio9设计的有问题,在aardio10中重新设计并保留了此功能,在aardio10中每个字符会有一个UTF标记,记录自己是UTF8,UTF16,还是ANSI编码的字符串,一个字符串在不能确定自己的编码时UTF标记可能为空,aardio会将无标记的字符串默认视为UTF8编码。

UTF8标记应当由aardio内核自动维护,用户不应当去获取或修改,但aardio仍然提供了两个函数string.getUtf,string.setUtf获取修改UTF标记 - 但尽可能不要去使用。aardio会自动去维护UTF标记,例如在源码中读取的字符串,一次成功的编码转换,或者string.len()函数一次成功的计算字符数,aardio在所有可能的机会都会设置UTF标记。

UTF标记的意义是支持编码的自动转换,并且可以避免重复转换,例如Unicode API就用到了UTF标记来同时支持UTF8、UTF16的字符串参数:
::User32.MessageBox(0,'UTF8编码字符串','UTF8编码的标题',0)
::User32.MessageBox(0,'UTF16编码字符串'u,'UTF16编码的标题'u,0)


回复

使用道具 举报

186

主题

2542

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2017-11-16 19:04:41 | 显示全部楼层
如果说你上次找不到《库函数文档》还可以理解,
那么这次又是因为找不到《aardio使用手册》里关于基础语法的文档吗?!

doc.png
回复

使用道具 举报

2

主题

39

帖子

324

积分

二级会员

Rank: 3Rank: 3

积分
324
发表于 2017-11-19 20:09:00 | 显示全部楼层
好像对编码又多理解了一点
回复

使用道具 举报

186

主题

2542

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2017-11-19 20:13:36 | 显示全部楼层
Danboy 发表于 2017-11-19 20:09
好像对编码又多理解了一点

那么说说你多理解了什么?!

这种基础语法规则,完全可以自己去看语法手册( 基础语法->字符串 ),
包括库函数文档,打开aardio就能找到.


回复

使用道具 举报

2

主题

39

帖子

324

积分

二级会员

Rank: 3Rank: 3

积分
324
发表于 2017-11-19 20:35:49 | 显示全部楼层
Jacen.He 发表于 2017-11-19 20:13
那么说说你多理解了什么?!

这种基础语法规则,完全可以自己去看语法手册( 基础语法->字符串 ),

import inet.whttp;
var http = inet.whttp();
var s = http.get('http://www.weibo.com')
//string.setUtf(s,(8|1)) //已知源编码格式设置标记符
console.debug(s)
这样写会乱码,加上string.setUtf(s,(8|1)),输出就不乱了,不知道console.debug和console.log为什么编码格式不一样,它们究竟接受的是什么编码格式
回复

使用道具 举报

186

主题

2542

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2017-11-19 20:36:08 | 显示全部楼层
向人求助也要有一些底线的,不要任何事都指望别人。

这就好像一个孩子,妈妈给他一个饼,他都懒得去咬一下,一直在痛苦的大叫饼在哪里,饼在哪里.........结果妈妈真的每次都跑去把饼嚼碎了硬塞到孩子的嘴里,也许这时候会有Danboy之流在旁边大声喝彩支持喂饼的行为。

但是妈妈出门了,把饼挂到孩子的脖子上,
孩子懒到不愿意低头去咬一下,就这样饿死了,Danboy之流可不会管他的死活。

-----------------------------------------------------------------

打开aardio点一下《库函数文档》,比低头咬一下送到嘴边的饼要容易的多,
论坛上的网友更不是你的妈对你有着某种责任和义务。


回复

使用道具 举报

186

主题

2542

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2017-11-19 21:32:15 | 显示全部楼层
Danboy 发表于 2017-11-19 20:35
import inet.whttp;
var http = inet.whttp();
var s = http.get('http://www.weibo.com')
前面还说这帖子让你懂了很多,看来你就是在吹牛逼嘛!
你这是把一个本来简单的事搞的很绕,让你不要用你偏要这么用,用以前也不看看文档。

string.setUtf(s,(8|1)) 的意思是标记为一个纯英文的字符串,
控制台本来就会自动UTF8转GBK编码,你明明是GBK,却举个牌子你其实不包含中文(UTF8/GBK兼容),一直冒充到最后一关,别人刚好需要GBK而已。然后你不知道从哪里找出一个 console.debug() 错上加错的刚好蒙过去。

aardio的编码是UTF8, 而你这个网站返回的是GBK,
你用 string.fromto(s,0,65001) 转换一下编码就可以了,
一个简单的事情,非要搞那么多花样。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2018-9-22 23:34 , Processed in 0.078125 second(s), 26 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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