关于ASP中按指定编码写入读取文件

61 篇文章 1 订阅
13 篇文章 0 订阅

什么是 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%>
其他编码的类推。

'打开文件
Public Function OpenFile(FileName As String) As Boolean
'FileName:需要打开的文件名

   
If ADO_Stream Is Nothing Then Exit Function

    Err.Number
= 0
   
On Error GoTo ferr

   
With ADO_Stream
        .Type
= 1
        .Mode
= 3
        .Open
        .LoadFromFile FileName
        .Position
= 0
        .Type
= 2
        .Charset
= IIf(Coding = "", "gb2312", Coding)
        FileBody
= .ReadText
        .Close
   
End With
    OpenFile
= True
   
   
Exit Function
ferr:
    ErrInfo
= FileName & "打开失败!错误信息:" & Err.Description
    Debug.Print ErrInfo
    Err.Number
= 0
End Function

'保存文件
Public Function SaveFile(FileName As String, strFileBody As String) As Boolean
'FileName:文件保存路径名字
'
strFileBody:需要保存的文件内容

   
If ADO_Stream Is Nothing Then Exit Function
   
    Err.Number
= 0
   
On Error GoTo ferr

   
With ADO_Stream
        .Type
= 2
        .Mode
= 3
        .Charset
= IIf(Coding = "", "gb2312", Coding)
        .Open
        .WriteText strFileBody
        .SaveToFile FileName,
2
   
End With
   
    SaveFile
= True
   
Exit Function
ferr:
    ErrInfo
= FileName & "保存失败!错误信息:" & Err.Description
    Debug.Print ErrInfo
    Err.Number
= 0
End Function

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值