什么是 UTF-8?
首先 UCS 和 Unicode 只是分配整数给字符的编码表. 现在存在好几种将一串字符表示为一串字节的方法. 最显而易见的两种方法是将 Unicode 文本存储为 2 个 或 4 个字节序列的串. 这两种方法的正式名称分别为 UCS-2 和 UCS-4. 除非另外指定, 否则大多数的字节都是这样的(Bigendian convention). 将一个 ASCII 或 Latin-1 的文件转换成 UCS-2 只需简单地在每个 ASCII 字节前插入 0x00. 如果要转换成 UCS-4, 则必须在每个 ASCII 字节前插入三个 0x00. 在 Unix 下使用 UCS-2 (或 UCS-4) 会导致非常严重的问题. 用这些编码的字符串会包含一些特殊的字符, 比如 ’\0’ 或 ’/’, 它们在 文件名和其他 C 库函数参数里都有特别的含义. 另外, 大多数使用 ASCII 文件的 UNIX 下的工具, 如果不进行重大修改是无法读取 16 位的字符的. 基于这些原因, 在文件名, 文本文件, 环境变量等地方, UCS-2 不适合作为 Unicode 的外部编码. 在 ISO 10646-1 Annex R 和 RFC 2279 里定义的 UTF-8 编码没有这些问题. 它是在 Unix 风格的操作系统下使用 Unicode 的明显的方法. 每一种语言的不同的编码页,增加了那些需要支持不同语言的软件的复杂度。因而人们制定了一个世界标准,叫做unicode.Unicode为每个字符提 供了唯一的特定数值,不论在什么平台上、不论在什么软件中,也不论什么语言。也就是说,它世界上使用的所有字符都列出来,并给每一个字符一个唯一特定数 值。 Unicode的最初目标,是用1个16位的编码来为超过65000字符提供映射。但这还不够,它不能覆盖全部历史上的文字,也不能解决 传输的问题 (implantation head-ache's),尤其在那些基于网络的应用中。已有的软件必须做大量的工作来程序16位的数据。 因此,Unicode用一些基本的保留字符制定了三套编码方式。它们分别是UTF-8,UTF-16和UTF-32。正如名字所示,在UTF-8中,字 符是以8位序列来编码的,用一个或几个字节来表示一个字符。这种方式的最大好处,是UTF-8保留了ASCII字符的编码做为它的一部分,例如,在UTF -8和ASCII中,“A”的编码都是0x41. UTF8并不算是一种电脑编码,而是一种储存和传送的格式,如前所述,每个Unicode/UCS字符都以 2或4个bytes来储存,看看以下的比较: 以"I am Chinese"为例 用ANSI储存:12 Bytes 用Unicode/UCS2储存:24 Bytes + 2 Bytes(header) 用UCS4储存:48 Bytes + 4 Bytes(header) 以"我是中国人"为例 用ANSI储存:10 Bytes 用Unicode/UCS2储存:10 Bytes + 2 Bytes(header) 用UCS4储存:20 Bytes + 4 Bytes(header) 由此可见直接以Unicode/UCS的原始形式来储存是一种极大的浪费,而且也不利于互联网的传输(中文稍为合算一点^_^)。 有见及此,Unicode/UCS的压缩形式--UTF8出现了,套用官方网站的首句话『UTF-8 stands for Unicode Transformation Format-8. It is an octet (8-bit) lossless encoding of Unicode characters.』,由于UTF也适用于编码UCS,故亦可称为『UCS transformation formats (UTF)』
UTF8是以8bits即1Bytes为编码的最基本单位,当然也可以有基于16bits和32bits的形式,分别称为UTF16和UTF32,但目前用得不多,而UTF8则被广泛应用在文件储存和网络传输中。
--------------------------------------------------------------------------------- ASP解决UTF-8: 两种生成xml的方法: FSO方法生成XML <%'生成XML,但是FSO生成的是ASCII码,是二进制的,不支持UTF-8,乱码! Dim xpath sql="select * From temp" set rs=db.execute(sql) xpath="data.xml" Set fso = Server.CreateObject("Scripting.FileSystemObject") Set fout = fso.CreateTextFile(Server.MapPath(xpath)) fout.WriteLine rs("temp") fout.close %>
ADODB.Stream方法生成XML <%'生成XML,用ADODB.Stream,支持UTF-8 Dim xpath sql="select * From temp" set rs=db.execute(sql) str=rs("temp")
Set objStream = Server.CreateObject("ADODB.Stream") With objStream .Open .Charset = "utf-8" .Position = objStream.Size .WriteText=str .SaveToFile server.mappath("kevin.xml"),2 .Close End With Set objStream = Nothing
rs.close Set rs=Nothing %> ----------------------------------------------------------------------------
ASP中操作UTF-8格式的文件 注意:这里说的ASP可不是ASP.net。 ASP由于是一种古老的语言,它的一些功能对UTF-8支持非常差。 比如,你想生成一个UTF-8格式的文件,使用常用的 Scripting.FileSystemObject 对象就不行。
Scripting.FileSystemObject 对象创建文件的函数,是下面方式: FileSystemObject.CreateTextFile(filename[,overwrite[,unicode]])
其中的 unicode 属性是这样描述的:
可选项。Boolean 值指明是否以 Unicode 或 ASCII 文件格式创建文件。如果以 Unicode 文件格式创建文件,则该值为 True;如果以 ASCII 文件格式创建文件,则该值为 False。如果省略此部分,则假定创建 ASCII 文件。
我们是无法用这个函数来创建UTF-8格式文件的。 这时候,我们可以使用 ADODB.Stream 对象,使用方法见下面:
Set objStream = Server.CreateObject("ADODB.Stream") With objStream .Open .Charset = "utf-8" .Position = objStream.Size .WriteText=str .SaveToFile server.mappath("/sitemap.xml"),2 .Close End With Set objStream = Nothing
附: ASCII 、Unicode 、 UTF-8 介绍: ASCII 是一种字符集,包括大小写的英文字母、数字、控制字符等,它用一个字节表示,范围是 0-127。 由于 ASCII 表示的字符非常有限,各个国家或者地区在此基础上提出了自己的字符集,比如在中国应用非常广泛的 GB2312,它为汉字提供了编码,用两个字节表示。 这些字符集之间互不兼容,相同的数字可能表示不同的字符,为信息交流带来了麻烦。 Unicode 是一种字符集,它将世界上的所有字符映射成一个唯一的数字(code point),比如字母 a 对应的数字 0x0041。目前 Unicode 还处于发展中,它所包容的字符越来越多。 在将 Unicode 表示的字符进行存储时,还需要一定的编码方式,比如 UCS-2,它用两个字节来表示 Unicode 编码的字符。而 UTF-8 是 Unicode 字符集的另外一种编码方式,它是变长度的,最多 6 个字节,小于 127 的字符用一个字节表示,与 ASCII 字符集的结果一样,因而具有非常好的兼容性,ASCII 编码下的英语文本不需要修改就可以当作 UTF-8 编码进行处理,应用非常广泛。
UTF-8 and Unicode FAQ http://www.linuxforum.net/books/UTF-8-Unicode.html
ADODB.Stream组件Charset属性值 http://www.5iya.com/blog/post/adodb_stream_charset_value.asp
用ADODB.Stream代替FSO读取文本文件 http://www.99net.net/study/page/1025101521.htm
----------------------------------------------------------------------------- 关于UTF-8 和 其他文字相兼容的解决方法
研究好多天了,也试过好多办法了,总结出目前发现最好的方法: 先说一下基本的东西: <%@ codepage=936%>简体中文 <%@ codepage=950%>繁体中文 <%@ codepage=65001%>UTF-8
codepage指定了IIS按什么编码读取传递过来的串串(表单提交,地址栏传递等)。 出乱码的原因也就是网站要整合的时候模块编码不一样引起的。 就像我的博客一样,整合的时候都会出这个问题,因为BLOG是Utf-8的, 近来很多网友都在为这个问题咨询,我尝试了很多种方法。 最方便的方法如下: 不要转换任何模块网页的编码该utf-8的还是utf-8,该Gb22312的还是Gb2312 在Utf-8模块的包文件(如conn.asp,但是要注意conn.asp必须是在第一行调用)最前面加上 <%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%> <%Session.CodePage=65001%> 在GB2312模块的包文件最前面加上 <%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%> <%Session.CodePage=936%> 其他编码的类推。 |