zoukankan      html  css  js  c++  java
  • 第三十九 ASP.NET编码

    *摘要
    。编码知识概述
    。易产生乱码的情况
    。.NET的编码类
    。ASP.NET下的编码
    。编码应用实例

    * 字符与编码的发展
    一、ASCII:计算机刚开始只支持英语,其它语言不能够在计算机上存储和显示。(英文 DOS)
    二、ANSI编码(本地化)为使计算机支持更多语言,通常用。0X80~0XFF范围的2个字节来表示1个字符。比如:汉字‘中’在中文操作系统中,使用[0xD6,0xD0]这两个字节存储。不同的国家和地区制定了不同的标准,由此产生了GB2312,BIG5,JIS等各自的编码标准。这些使用2个字符来代表一个字符的各种汉字延伸编码方式,称为ANSI编码。在简体中文系统下,ANSI编码代表GB2312编码,在日文操作系统下,ANSI编码代表JIS编码。不同ANSI编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段ANSI编码的文本中。(中文DOS,中文Windows95/98,日文Windows95/98)
    三、UNICODE(国际化):为了使国际间信息交流更加方便,国际组织制定了UNICODE字符集,为各种语言中的每一个字符设定了统一并且唯一的数字编码,以满足跨语言,跨平台进行文本转换,处理的要求。(WindowsNT/2000/xp,Linux,Java)

    * 字符串在内存中的存放方法
    。在ASCII阶段,单字节字符串使用一个字节存放一个字符(SBCS)。比如,“Bob123”在内存中为:
    -42 6F 62 31 31 33 00
    -B  o  b  1  2  3  \0
    。在使用ANSI编码支持多种语言阶段,每个字符使用一个字节或多个字节来表示,比如,“中文123”在中文Windows95内在职为7个字节:
    -D6D0 CEC4 31 32 33 00
    -中   文   1  2  3  \0
    。UNICODE中,计算机存放字符串时,改为存放每字符在UNICODE字符集中的序号。目前计算面一般使用2个字节(16)位来放存一个序号(DBCS),因此,这种方式存放的字符也被称作宽字节字符。比如,字符串"中文123"在Windows2000下,内存中实际存放的是5个序号,共10个字节:
    -2E4E 8765 3100 3200 3300 0000
    -中   文   1    2    3      \0


    * 字符集与编码
    。各个国家和地区所制定的不同ANSI编码标准中,都只规定了各自语言所需的“字符”。比如:没字标准(GB2312)国为, 有规定韩国语字符怎样存储。这些ANSI编码标准所规定的内容包含两层含义:
    -字符集:所包含“字符”的集合
    -编码:规定每个“字符”分别用一个字节还是多个字节存储,用哪些字节来存储
    。“UNICODE”字符集包含了各种语言中使用到的所的“字符”。用来给UNICODE字符集编码的标准有很多种,比如:UTF-8,UTF-7,UTF-16,UnicodeLittle,UnicodeBig等。

    * 常用编码简介
    单字节字符编码:ISO-8859-1:最简单的编码规则,每一个字节直接夜为一个UNICODE字符。比如,[oxD6,oxD0]这两个字节,通过ISO-8859-1转化为字符符串时,将直接得到[0x00D6,0x00D0]两个UNICODE字符,即"乱码"。反之,将UNICODE字符串通过ISO-8859-1转化为字节串时,只能正常转化0~255范围的字符。
    ANSI编码:
    (GB2312,BIG5)把UNICODE字符串通过ANSI编码转化为“字节串”时,根据各自编码的规定,一个UNICODE字符可能转化成一个字节或多个字节。
    (Shift_JIS,ISO-8859-2,...)反之,将字节串转化成字符串时,可能多个字世转化成一个字符。比如[0xD6,0xD0]这两个字节,通过GB2312转化为字符串时,将得到[0x4E2D]一个字符,即“中”字。
    “ANSI”编码的特点:
    1、这些“ANSI”编码标准都只能处理各自语言范围之内的UNICODE字符。
    2、“UNICODE字符”与“转换出来的字节”之间的关系是人为规定的。

    UNICODE编码
    (UTF-8,UTF-16,UnicodeBig)与“ANSI”编码类似的,把字符串通过UNICODE编码转化成“字节串”时,一个UNICODE字符可能转化

    成一个字节或多个字节。
    与“ANSI编码”不同的是:
    1、这些“UNICODE编码”能够处理所有的UNICODE字符。
    2、“UNICODE”字符与“转换出来的字节”之间是可以通过计算得到的。

    * Unicode字符集
    。名称的由来
    -Unicode字符集编码是Universal Multiple-Octet Coded CHaracter Set通过多八位编码字符集的简称,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言,跨平台进行文本转换,处理的要求。
    。UTF-8编码
    -UTF-8是Unicode的其中一个使用方式。UTF是Unicode Translation Format,即把Unicode转做某种格式的意思。UTF-8使用可变长度字节来储存Unicode字符,例如ASCII字母继续使用1字节储存,重音文字,希腊字母或西里尔字母等使用2字节来储存,而常用的汉字就要使用3个字节。辅助平面字符则使用4字节。
    。UTF-32,UTF-16和UTF-8:
    -Unicode标准的编码字符集的字符编码方案,UTF-16使用一个或两个末分配的16位代码单元的序列对Unicode代码点进行编码:UTF-32即将每一个Unicode代码点表示为相同值的32位数。


    * 易产生乱码的情况
    。非UNICODE程序在不同语言环境间移植时的乱码。
    。网页提交字符串
    。从数据库读取字符串
    。电子邮件中的字符串

    * 不同语言环境间移值
    。非UNICODE程序中的字符串,都是以某种ANSI编码形式存在的。如果程序运行时的语言环境与开发时的语言环境不同,将会导致ANSI字符串的显示失败。
    。由于客观原因,有时候我们必须在中文操作系统下运行非NUICODE的日文软件。这时我们可以采用一些工具,比如,南极星,AppLocale等,暂时的模拟不同的语言环境。

    * 网页提交字符串
    。当页面中的表单提交字符串时,首先把字符串按照当前页面的编码,转化成字节串。然后再将每个字节转化成“%XX”的格式提交到Web服务器。比如,一个编码为GB2312的页面,提交“中”这个字符串时,提交给服务器的内容为“%D6%D0”。
    。在服务器端,Web服务器把收到的“%D6%D0”转化成[0xD6,0xD0]两个字节,然后根据GB2312编码规则得到“中”字。
    。默认情况下,当提交“%D6%D0”给服务器时,将返回[0x00D6,0x00D0]两个UNICODE字符,两不是返回一个“中”字符。所以出现乱码。

    * 从数据库读取字符串
    。通过数据库客户端(比如ODBC或JDBC)从数据库服务器中读取字符串时,客户端需要从服务器获知所使用的ANSI编码。当数据库服务器发送字节流给客户端时,客户端负责将字节流按照正确的编码转化成UNICODE字符串。

    * 电子邮件中的字符串
    。当一段Text或者HTML通过电子邮件传送时,发送的内容首先通过一种指定的字符编码转化成“字节串”,然后再把“字节串”通过一种指定的传输编码(Content-TransferEncoding)进行转化得到另一串“字节串”
    。最常用的Content-Transfer-Encoding有Base64和Quoted-Printable两种。

    * 邮件标题编码
    。邮件的标题,用了一种更简短的格式来标注“字符编码”和“传输编码”。比如,标题内容为“中”,则在邮件源代码中表示为:
    。//正确的标题格式
    Subject:=?GB2312?B?1tA=?=
    -第一个“=?”与"?"中间的部分指定了字符编码,在这个例子中指定的是GB2312.
    -“?”与“?”中间的“B”代表Base64。如果是“Q”则代表QuotedPrintable。
    -最后“?”与“?=”之间的部分,就是经过GB2312转化成字节串,再经过Base64转化后的标题内容。
    。如果“传输编码”改为Ouoted-Printable,同样,如果标题内容为"中"
    -Subject:=?GB2312?Q?=D6=D0?


    * System.Text
    。System.Text命名空间包含表示ASCII,Unicode,UTF-7和UTF-8字符编码的类;用于将字符块转换为字节块和将字节块转换为字符块的抽象基类。
    ASCIIEncoding:表示Unicode字符的ASCII字符编码。
    Decoder:将已编码的字节块转换为Unicode字符块。
    Encoder:将Unicode字符块转换为已编码的字节块。
    Encoding:表示字符编码
    StringBuilder:表示可变字符串。无法继承此类
    UnicodeEncoding:表示Unicode字符的UTF-26编码
    UTF7Encoding:表示Unicode字符的UTF-7编码
    UTF8Encoding:表示Unicode字符的UTF-8编码


    * ASP.NET下的编码
    。Web.config文件全球化:
    -<globalization requestEncoding="utf-8" responseEncoding="uft-8" />
    -requestEncoding是app请求时的编码,
     responseEncoding是IIS响应编码
    。Response.ContentEncoding:获取或设置输出流的HTTP字符集。
    。HttpRequest.ContentEncoding:表示客户端的字符集的Encoding对象。

    * 汉字编码
    。1980年,为了便每一个汉字有一个全国统一的代码,我国颁布了第一个汉字编码的国家标准:GB2312-80《信息交换用汉字编码字符集》基本集,简称GB2312.这个字符集是国内所有汉字系统的统一标准。到了后来又公布了国家标准GB18030-2000《信息交换用汉字编码字符集基本集的扩充》,简介GB18030
    。目前在中文Windows操作系统中,.NET编程中默认的代面页就是GB18030简体中文
    。中文汉字字符可以使用区位码来表示:
    -例如“好”字的十六进制区位码是ba c3,前两位是区域,后两位是代表位置,ba处在第26区,"好"处在此区汉字的第35位也就是c3位置,所以数字代码就是2635。这就是GB2312汉字区位原理。


    * Base64编码规则
    。Base64编码的思想是采用64个基本的ASCII码字符对数据进行重新编码。它将需要编码的数据拆分成字节数组。以3个字节为一组。按顺序列24位数据,再把这24位数据分成4组,即每组6位。再在每组的最高位前补两个0凑足一个字节。这样就把一个3字节为一组的数据重新编码成了4个字节。当所要编码的数据的字节数不是3的整数倍数,也就是说在分进最后一组不够3个字节。这进在最后一组填充1到2个0字节。并在最后编码完成后在结尾添加1到2个“=”。

    。例:将对ABC进行BASE64编码
    首先取ABC对应的ASCII码值。A(65)B(66)C(67)
    再取二进制值A(01000001)B(01000010)C(01000011)
    然后把三个字节的二进制码接起来(010000010100001001000011),
    再以6位为单位分成4个数据块并在最高位填充两个0后形成4个字节的编码后的值
    (00010000)(00010100)(00001001)(00000011)
    再把这四个字节数据转化成10进制数得(16)(20)(19)(3)
    最后根据BASE60给出的64个基本字符表,查出对应的ASCII码字符(Q)(U)(J)(D)。
    这里的值实际就是数据在字符表中的索引。
    。注BASE64字符表:
    ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

  • 相关阅读:
    IOS 作业项目(1) 关灯游戏 (百行代码搞定)
    Object-C 基础笔记5---Category
    Object -c基础知识(5)--release 之后 retainCount为何为1
    Foundation--NSString , array and Dictionary
    Foundation--结构体
    Object-C 基础笔记4---ARC内存管理
    141. Linked List Cycle
    139. Word Break
    138. Copy List with Random Pointer
    133. Clone Graph
  • 原文地址:https://www.cnblogs.com/iceberg2008/p/1437689.html
Copyright © 2011-2022 走看看