html中字符编码的确定算法(一)

来源:互联网 发布:域名注册案例 编辑:程序博客网 时间:2024/06/05 05:42

     html中字符编码的确定算法(一)

tomorrow.cyz@gmail.com

    在某些情况下,在解析文档之前明确确定它的编码方式是不切实际的。因此,规范提供了一个两步机制(two-pass mechanism),以及一个可选的pre-scan。允许可以在开始解析文档之前对所有可用的字节采用一个简化的解析算法。然后,真正的解析开始,使用这个预解析和带外的meta数据派生出来的编码(encoding)。如果在文档加载的时候用户代理发现了一个同现有信息(就是之前预解析和带外的meta数据派生出来的编码)冲突的编码声明,解析器就以真正的编码重新执行一次解析。

    用户代理采用编码测探算法(encoding sniffing algorithm)来确定在第一步解码文档的时候使用的字符编码。这个算法以用户代理可用的带外meta数据(比如Content-Type metadata)以及当前所有可用的字节为输入,返回一个编码(encoding)和一个confidence。Confidence可以是tentative,或者certain,或者irrelevant。使用的encoding,以及在那个编码中的confidence是tentative的还是certain的,在解析的时候用来确定是否需要更改编码。如果没有编码是必要的,比如parser正在解析unicode字符流(stream of Unicode characters)且根本没有必要编码,则confidence是irrelevant。下面是确定encoding的算法。

 

1.用户指定至上: 如果用户以一个特定的encoding明确指定用户代理覆盖文档的character encoding,可以返回那个encoding以及certain的confidence,终止执行这些步骤。

 

2. 传输层指定:如果传输层指定了encoding(比如http的content-type头部指定了encoding),并且这个encoding是支持的,返回该encoding以及certain的confidence,终止这些步骤。

 

3.等待:在这个算法中,用户代理在当前这一步或者后面的步骤中都可以等待资源更多的字节到来。通常来说,预解析(preparsing)源来获取encoding能够提高性能,因为它减少了扔掉在解析以查找encoding信息的时候使用的数据结构的需要。但是,如果用户代理延迟了太久以获得数据来确定encoding,则延迟的代价超过了预解析带来的性能提升。

 

4.BOMS查找:字节流同BOM表中的第一列匹配,则返回改行第二列的encoding,以及certain的confidence。

Bytes in Hexadecimal

Encoding

FE FF

Big-endian UTF-16

FF FE

Little-endian UTF-16

EF BB BF

UTF-8

 

 

5.文档中查找:文档中查找encoding的算法将在后面进行描述,我这里称之为文档查找编码算法,它是一个两步算法。

 

6.如果用户代理具有这个页面的的可能encoding的信息(比如基于上次访问是页面的encoding),返回该encoding,以及tentative的confidence,终止这些步骤。

 

7.自动检测:用户代理可以通过对数据流的一些分析算法尝试自动检测character encoding。这些算法可能使用资源的有关信息资源以外的资源的内容,包括资源地址。如果自动检测成功确定了character encoding,则返回该encoding,以及tentative的confidence,终止这些步骤。 A composite approach to language/encoding detection( http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html)一文中描述了一种encoding的检测方法。UTF-8 encoding有一个高检测能力的位模式。包含大于0x7F这样符合UTF-8模式的字节的文档很有可能是UTF-8,而不满足这一点的则很有可能不是UTF-8。用户代理查找最通用的encoding是被鼓励的。

 

8.否则,返回一个实现默认或者用户指定的缺省的character encoding,以及tentative的confidence。

在受控环境或者文档的encoding可以被规定的环境下(比如,对于那些新的网络下专用的用户代理),建议采用通用的UTF-8 encoding。 在其它环境下,缺省的encoding通常由语言环境决定(该语言下,页面经常采用的encoding)。下表给出的基于语言环境的一个缺省encoding值。

Locale language

Suggested default encoding

ar

UTF-8

be

ISO-8859-5

bg

windows-1251

cs

ISO-8859-2

cy

UTF-8

fa

UTF-8

he

windows-1255

hr

UTF-8

hu

ISO-8859-2

ja

Windows-31J

kk

UTF-8

ko

windows-949

ku

windows-1254

lt

windows-1257

lv

ISO-8859-13

mk

UTF-8

or

UTF-8

pl

ISO-8859-2

ro

UTF-8

ru

windows-1251

sk

windows-1250

sl

ISO-8859-2

sr

UTF-8

th

windows-874

tr

windows-1254

uk

windows-1251

vi

UTF-8

zh-CN

GB18030

zh-TW

Big5

All other locales

windows-1252

 

blog.csdn.net/dlmu2001

原创粉丝点击