现在的位置: 首页 > 综合 > 正文

C#中Encoding简要介绍总结,编码的说明

2013年10月12日 ⁄ 综合 ⁄ 共 3477字 ⁄ 字号 评论关闭

因为最近写一个作业,要用到网络传输,在网络传输过程中不得不用到Encoding, 需要把要传输的数据编码成字节数组 (byte[] 数组),然后看到有多种编码方式,就对各个方式学习了一下,并给大家共享一下。

 

在写Web Service的时候,和用Socket传输的时候,我们只能通过byte[] 数组来传送数据,不能返回我们希望的int, long, float等常用类型。这样就会用到Encoding对返回的数据进行编码。

 

Encoding就是把一些列Unicode字符转换为byte[] 数组序列,这样就可以在网络中传送byte[] 数组。

 

1. 什么是Unicode字符

:  Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。随着计算机工作能力的增强,Unicode也在面世以来的十多年里得到普及。

Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。Unicode用数字0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符,或者说有1114112个码位。码位就是可以分配给字符的数字。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。

 

相关介绍连接:http://baike.baidu.com/view/40801.htm 

http://en.wikipedia.org/wiki/Unicode

通用字符集(Universal Character Set,UCS)是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所定义的标准字符集。UCS-2用两个字节编码,UCS-4用4个字节编码。 1991年前后,两个项目的参与者都认识到,世界不需要两个不兼容的字符集。于是,它们开始合并双方的工作成果,并为创立一个单一编码表而协同工作。

在Unicode中:汉字“字”对应的数字是23383。在Unicode中,我们有很多方式将数字23383表示成程序中的数据,包括:UTF-8、UTF-16、UTF-32。UTF是“UCS Transformation Format”的缩写,可以翻译成Unicode字符集转换格式,即怎样将Unicode定义的数字转换成程序数据。例如,“汉字”对应的数字是0x6c49和0x5b57,而编码的程序数据是:

  BYTE data_utf8[] = {0xE6, 0xB1, 0x89, 0xE5, 0xAD, 0x97}; // UTF-8编码

  WORD data_utf16[] = {0x6c49, 0x5b57}; // UTF-16编码

  DWORD data_utf32[] = {0x6c49, 0x5b57}; // UTF-32编码

  这里用BYTE、WORD、DWORD分别表示无符号8位整数,无符号16位整数和无符号32位整数。UTF-8、UTF-16、UTF-32分别以BYTE、WORD、DWORD作为编码单位。“汉字”的UTF-8编码需要6个字节。“汉字”的UTF-16编码需要两个WORD,大小是4个字节。“汉字”的UTF-32编码需要两个DWORD,大小是8个字节。根据字节序的不同,UTF-16可以被实现为UTF-16LE或UTF-16BE,UTF-32可以被实现为UTF-32LE或UTF-32BE。下面介绍UTF-8、UTF-16、UTF-32、字节序和BOM。

UTF-8以字节为单位对Unicode进行编码。

UTF-16编码以16位无符号整数为单位

UTF-32编码以32位无符号整数为单位

 

提到了Unicode编码,就不得不提到作为每一个程序员在最初学习c语言的时候会接触到的ASCII编码。

ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。

可以看出,Unicode编码的标识范围,要比ASCII码广泛的多,可能是因为ASCII码最初就在美国制定的。

在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,象a、b、c、d这样的52个字母(包括大写)、以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了所谓的ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。

  美国标准信息交换代码是由美国国家标准学会(American National Standard Institute , ANSI )制定的,标准的单字节字符编码方案,用于基于文本的数据。起始于50年代后期,在1967年定案。它最初是美国国家标准,供不同计算机在相互通信时用作共同遵守的西文字符编码标准,它已被国际标准化组织(International
Organization for Standardization, ISO)定为国际标准,称为ISO 646标准。适用于所有拉丁文字字母。

 

ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。其中:

  0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(振铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为8、9、10 和13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。

  32~126(共95个)是字符(32sp是空格),其中48~57为0到9十个阿拉伯数字

  65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。

同时还要注意,在标准ASCII中,其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。

  后128个称为扩展ASCII码,目前许多基于x86的系统都支持使用扩展(或“高”)ASCII。扩展ASCII 码允许将每个字符的第8 位用于确定附加的128 个特殊符号字符、外来语字母和图形符号。

 

 

2. C# 中Encoding的说明

C#中Encoding的方法包含了一下几个:

ASCIIEncoding

UTF8Encoding

UTF7Encoding

UnicodeEncoding

UTF32Encoding

 

ASCIIEncoding: 把Unicode字符编码成7位的ASCII字符,这种编码方式只能支持字符值在U+0000和U+007F的字符。

UTF8Encoding:支持所有的Unicode字符

UTF7Encoding:支持所有的Unicode字符

UnicodeEncoding: 用UTF16进行编码

UTF32Encoding: 支持所有的Unicode字符.

 

在.NET Framework  中,默认的用UnicodeEncoding 方式,即使用UTF16进行编码

 

特别的,UTF8Encoding应该比ASCIIEncoding更好,如果只是对ASCII编码,他们两个的表现差不多,但是ASCIIEncoding没有错误检测,UTF8Encoding有更好的安全性。

UTF8Encoding的编码速度要比ASCIIEncoding快,没有什么特别情况下,最好使用UTF8Encoding编码。 ASCIIEncoding的存在原因是可能有一些遗留的程序以前是使用ASCIIEncoding编码的,所以才有ASCIIEncoding编码的存在。

 

抱歉!评论已关闭.