Webcore中文本资源编解码(dlmu2001)

Webcore中文本资源编解码

 

dlmu2001

 

本文描述的文本资源编解码,针对的是字符串编解码,如UTF-8,GB2312,而非传输编解码(如gzip)。

   关于字符串编码的理论知识,如果你还不了解,可以参考http://baike.baidu.com/view/1204863.htm

   我们以一个最简单的网页为例,假设服务器上有一个纯链接的页面,没有任何派生资源(imagecsssoundsubframejavascript等)。服务器传送给我们的页面,他们字符串编码是各种各样的,常见的有utf8gb2312。如果我们用utf8的解码方式去解gb2312的网页,那么网页显示出来的就是乱码。所以,webcore里面,需要首先找出服务器提供的网页的字符串编码格式,然后调用对应的解码接口进行解码,输出webcore的其它模块接受的unicode方式的文本(String类)。

   那如何来确定网页的字符串编码呢,一般有如下几种方式

1)父亲节点继承过来的charset属性,比如Iframe里面的charset,如果不指定,则一般继承自原生页面(当然,前提是subframe和原生页面的domain是一样的)

2HTTP响应头部中包含了charset字段

3)如果有外部的css,也可能由外部css来指定charset

4HTMLhead元素里面的meta标签指定了字符串编码,如
<head><meta http-equiv="Content-Type" content="text/html;charset=gb2312">

5)如果是XML页面,XML头部中指定了charset,如
     <?xml version="1.0" encoding="UTF-8"?>

对一个浏览器来说,可能还会支持用户直接指定字符串编码方式,自动识别。

 

  WebCore中同字符串解码处理相关的文件主要是 TextResourceDecoder.h/TextResourceDecoder.cpp ,TextCodec.h/TextCodec.cpp, 以及不同平台的字符串解码的porting(如TextCodecICU.cpp,TextCodecQt  .cpp,TextCodecUTF16.cpp等),这里以TextCodecICUporting为例来理解。

  

  WebCore中通过DocumentWriter类维护了一个TextResourceDecoder类的指针m_decoder,以此来实现对文本资源的解码功能的调用和控制。 

  当网络有数据到来的时候,会调用DocumentWriter.cppcreateDecoderIfNeeded函数,这里可以看到一个TextResourceDecoder的创建,首先考虑的是设置中是否允许自动识别,其后是HTTP 响应的header中是否有charset头部(m_decoding),如果此处调用了TextResourceDecoder类的setEncoding方法设置了编码方式,则之后就不需要再去检查HTML中的meta标签等。

  在创建了decoder以后,就可以对数据进行解码了,DecodedDataDocumentParser类的appendBytes函数调用了TextResourceDecoderdecode方法,对到来的数据进行解码,由于数据是分段到了,所以分段解码。如果数据来齐了,或者中断了,则调用TextResourceDecoderflush函数来结束解码流程。

 

TextResourceDecoder类主要实现两个功能,一个是charset的获取,包括metacharset的获取,xmlcharset的获取,charset的自动识别(KanjiCode类)。另外一个是解码组件的调用和维护。

解码组件的维护是通过成员变量m_codec来完成的。在开始decode的时候,调用newTextCodec接口,根据charset类型,来创建一个解码组件,然后调用解码组件的decode方法完成解码(该方法通过TextCodec类进行了封装,通过TextCodecICU等类进行了实现)。解码完成以后,则将m_codec释放(clear)。需要注意的是,在TextResourceDecoder类的flush接口中,需要先进行decode,才进行clear,以免丢失数据。

 

最后说一下TextEncodingRegistry.cpp这个文件,从名字也可以看出来,它用来负责解码控件的注册和管理,相当于一个容器,来匹配编码方式和对应的解码组件。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Python自动登录校园网,可以借助selenium库来实现。selenium是一个自动化测试工具,可以模拟用户在浏览器的操作。 首先,你需要安装selenium库和相应的浏览器驱动,比如geckodriver(Firefox)或chromedriver(Chrome)。根据引用的信息,你可以使用geckodriver来模拟火狐浏览器。 接下来,你可以编写Python脚本来实现自动登录校园网。根据引用的信息,你可以参考下面的示例代码: ```python from selenium import webdriver from selenium.webdriver.common.keys import Keys # 创建一个Firefox浏览器实例 driver = webdriver.Firefox() # 打开登录页面 driver.get('http://portal.dlmu.edu.cn') # 找到账号输入框并输入账号 username_input = driver.find_element_by_id('username') username_input.send_keys('your_username') # 找到密码输入框并输入密码 password_input = driver.find_element_by_id('password') password_input.send_keys('your_password') # 提交表单 password_input.send_keys(Keys.RETURN) # 登录成功后可以继续执行后续操作 # 关闭浏览器 driver.quit() ``` 在这个示例代码,我们使用selenium打开了登录页面,并找到了账号输入框和密码输入框,然后通过send_keys方法输入了账号和密码,并模拟了按下回车键来提交表单。你只需要将`your_username`和`your_password`替换为你的实际账号和密码即可。 请注意,编写自动登录脚本时需要遵守学校的网络使用规定,并确保你的行为合法和符合学校的规定。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Python selenium实现开机自动登录大连海事校园网](https://blog.csdn.net/kofi6/article/details/116136222)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值