编码,charset,乱码,unicode,utf-8与.net简单释义

很久没有写blog了﹐今天下午工作刚好告一段落﹐有点时间﹐就把上周花了很多时间总结出来的一些计算机字符相关的心得写出来﹐希望能够帮助当初和我一样迷茫的人能够容易理解﹐也希望能够引出玉来(这么多废话﹐还不快开始...)

由于公司使用的是繁体操作系统﹐而我有时习惯在自己家里的简体计算机上写一些程序﹐但是当我用U盘把代码在两者之间copy时﹐经常发现文件中文的地方成了乱码﹐所以就花了些时间到网上查了一下﹐发现有很多关于乱码问题的讨论﹐按自己的方法总结了一下(有不对的地方﹐还希望各位指出):

1.文件分为文本文件和二进制文件﹐不过本质都一样﹐都是些01。

2.计算机存储设备存储的0或1﹐称为计算机的一个二进制位(bit)。

3.二进制文件的0和1有专门的应用程序来读﹐所以它们没有什么乱不乱码的问题﹐只要该程序认得就行。(像doc,xls,exe,dll等)

4.文本文件就不一样了﹐notepad要认识它﹐vs.net要认识它,UE也要认识它...所以它们就要有一个标准。这个标准的原理其实很简单﹐就是把所有的字符都给它一个序号﹐然后根据这个序号来找字符就可以了。这个东东就是编码表,也叫字符集(charset)。

5.文本文件存的都是字符﹐如﹕A,?,@,x。很明显一个bit不能表示﹐刚好计算机的存储单位--字节(byte)就是多个字节(1个byte=8个bit),因此用byte来表示字符就理所当然了。

6.第一个编码表--ASCII码很快产生﹐很简单﹐就是用一个byte来表示一个字符(最高位置0),总共能存储128(2^8)个字符。如A用65表示﹐存在计算机中就是01000001(65)﹐为了书写方便﹐我们一般记作0x41(16进制),97则表示小写的a,存在计算机中就是01100001(97)﹐记作0x61。?用63表示,记作0x3F。

7.英语国家的大小写字母加起来才52个字符﹐再加上数字﹐符号和一些特殊字符﹐已经足够使用。所以ASCII刚开始非常流行(谁叫计算机不是咱中国发明的... )

8.随着计算机的普及﹐当非英语系的国家开始使用时﹐ASCII已经明显不能满足了(总不成天天使用xiao sheng来表示"小生"吧),所以这些国家(地区)就开始制订自己的标准。

9.中国大陆制订了简体汉字的字符集(GB2312)。和英语国家不同﹐我们的汉字远远不止128个﹐所以一个byte肯定不能表示完﹐那就多加个byte,16位(65536)总可以了吧。不过这样虽解决了位数不够的问题﹐但是原来的英文文件怎么办?总不成又全部拿出来改成双字节吧。幸好﹐居然发现原来的ASCII的第一位居然是0﹐那我们把第1位改成1不就OK了吗?以后凡看到0开头的就读1个字节﹐1开头的就读2个字节。(而且128*128表示所有的简体字也足够了)

10.因此在GB2312标准中,"小"的序号是0xD0A1,表示成11010000 10100001,而A还是表示成01000001,这就是为什么简体操作系统读ASCII文件不会乱码﹐而反之则不然的原因。

11.目前来说﹐情况还比较好﹐中国大陆的计算机运行正常。

12.看到中国大陆制订了一个标准﹐其它国家和地区也不甘示弱﹐纷纷亮出自己的字符集,于是乎什么BIG5(中国台湾),shift_jis(日本),ks_c_5601-1987(韩国)都闪亮登场﹐一时间百鸟争鸣,百花齐放。

13.每个国家都想与ASCII保持兼容﹐理所当然﹐后面的字符就完全不一样了﹐因此﹐同样的0xD0A1,在GB2312中是"小"字﹐而在BIG5中却是"苤"字。你想想﹐这样不乱才怪。

14.到了这时候﹐总有人会想到﹐再这样继续下去是肯定不行的﹐于是它们就想到了﹐如果有一个标准﹐能包括所有字符那不就OK了吗?

15.于是"大哥大"标准就出来了﹐这就是unicode,为了能够足够表示世界上的所有字符这样光荣而又伟大的任务﹐这家伙用了四个字节来表示(2的32次方到底是多少﹐我也懒得算了),这下好了﹐天下太平了﹐再也不会有麻烦了﹐耳根清静了...(打住﹐你小子这么这么罗嗦呀)

15.不过unicode好是好﹐但是毕竟四个字节表示一个字符"浪费"太大了(我那破猫上网容易吗﹐电信黑呀﹐说好是2M﹐就给我200K...)﹐而且大家"惊奇"地发现﹐居然世界上一些"较强大"的国家的字符刚好集中在前65536位前﹐呵呵﹐结果unicode也分成了unicode-16和unicode-32了﹐自然﹐前者只用两个字节表示(所以只能表示前65536位喽,欧亚国家大部分字符都OK了﹐什么﹐你们那个@$Y$%字符没有﹐呵呵﹐不管我什么事,找标准协会﹐都是那帮家伙弄的...)

时间: 2024-07-28 13:40:51

编码,charset,乱码,unicode,utf-8与.net简单释义的相关文章

编码,charset,乱码,unicode,utf-8与.net简单释义(续)

上篇blog讲了一下unicode等编码的问题﹐不过并没有涉及程序﹐所以这次就用.net来证实一下上次的这些东东. 在证明那些东东之前﹐首先把.net中关于处理encoding,二进制,16进制,byte等相关类别和方法罗列一下. 1.byte与string(那些255以内的整数)的相互转换(各种进制之间的相互转换) 使用System.Convert类别 string to byte Convert.ToByte(string,base) base:2表示二进制,8表示八进制,10表示十进制,1

字符编码知识:Unicode、UTF-8、ASCII、GB2312等编码之间是如何转换的?

转自:  http://apps.hi.baidu.com/share/detail/17798660 字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得字符编码的知识.不注意的人可能对这个不在意,但这些名词有时候实在让人迷惑,对想学习计算机知识的人来说,搞懂它也十分重要,我也是在学习中慢慢了解了一些这方面的知识. 1. ASCII码      在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被

图片-VC 中编码转换乱码问题

问题描述 VC 中编码转换乱码问题 为什么a是'{'??? 解决方案 http://www.guokr.com/blog/763017/ 检查转换是否正确,编码的选择等 解决方案二: 编码转换是否正确 对应编码格式支持吗

oracle-Oracle数据库编码US7ASCII 乱码问题

问题描述 Oracle数据库编码US7ASCII 乱码问题 开发过程中遇到一个问题,Oracle数据库编码是 US7ASCII, 在显示数据库中文内容时,页面显示的全部是乱码, 正常的应该将数据库编码改为 ZHS16GBK 就可以了, 但是目前 由于数据库环境不能变,有没有别的办法正常显示数据库的内容 解决方案 Oracle数据库编码一般是 ZHS16GBK,但是 遇到一个Oracle数据库是 US7ASCII编码,在显示中文的时候遇到了问题,出现乱码下面给出如下解决方式: 步骤一:读取编码的配

java中unicode和中文相互转换的简单实现_java

如下所示: package test.com.gjob.services; import java.util.Properties; public class Test { public static void main(String[] args) { String s = "简介"; String tt = gbEncoding(s); // String tt1 = "你好,我想给你说一个事情"; System.out.println(decodeUnicod

编码、乱码问题

原文: http://gsdhaiji-cai.iteye.com/blog/1148049 一.编码进程 [01编码]--很久很久以前,为了表示二极管的通.分,我们引入的高电平.低电平,之后又引入的1.0编码进行代替   [ASCII编码]--很久以前,也就是上个世纪60年代,美国佬为了把计算机的"0101010"编码与文字进行对应起来,制定了一套ASCII编码方案.人总是自私的,他只对自己的语言进行编码,26个字母.数字.其他符号,只用了7位二进制数搞定,第一位用0表示,预留着.所

计算机中的字符串编码、乱码、BOM等问题详解_相关技巧

因为电脑是windows 7系统,开发环境又在linux,经常在linux碰到乱码问题,很是痛苦,于是决定好好了解编码的来龙气脉,并分享个各位,免得出现乱码时不知所措. 是否存在文件编码 在讲解字符编码之前,我们需先明确文件本身没有编码一说,只有文字才有编码的概念,我们通常说某个文件是什么编码,通常是指文件里字符的编码. vim为什么会出现乱码 我在linux下一般使用vim进行文件编辑,发现经常会碰到乱码的情况,那么为什么会出现乱码呢? 首先我们了解下vim编码方面的基础知识,关于编码方面vi

ASP中Utf-8与Gb2312编码转换乱码问题的解决方法 页面编码声明_应用技巧

出现这样的问题是当你浏览UTF-8编码的时候,服务器默认用UTF-8的引擎来输出html,当你用再浏览GB2312的页面时,它还是用UTF-8来输出本应是GB2312编码的页面所以会乱码. 为了这个问题烦了我一个早上,终于的蓝色理想上得到解决. 首先让我们来了解一下Session对象提供了四个属性. 1.CodePage 读/写.整型. 定义用于在浏览器中显示页内容的代码页(Code Page).代码页是字符集的数字值,不同的语言和场所可能使用不同的代码页.例如,ANSI代码页 1252用于美国

android POST数据遇到的UTF-8编码(乱码)问题解决办法_Android

今天遇到这样一个bug:客户端POST到服务器的一段数据导致服务器端发生未知异常.服务器端确认是编码转换错误.于是截取网络数据包进行分析,发现客户端POST的json数据中包含下面一段(hex形式): 复制代码 代码如下: ... 61 64 20 b7 20 52 69 63 ... 问题就出在这个b7上.查阅Unicode代码表后发现,U+00b7是MIDDLE DOT,它的UTF-8表现形式应该是c2 b7,但为何客户端发送的数据中它变成了b7? 由于系统使用了ormlite.gson和a