`

编码,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$%字符没有﹐呵呵﹐不管我什么事,找标准协会﹐都是那帮家伙弄的...)

16.虽然标准出来了﹐可是好歹ASCII也用了这么久﹐那些英语国家也在那里嚷嚷﹐这倒好﹐搞个什么破标准﹐我们又没有得到什么好处﹐反而让我们原来的程序都运行不了了(为什么呀﹐你想想﹐原来我们的程序字符都是一个字节一个字节认﹐现在倒好﹐全改成2个一起认﹐这还怎么跑呀?)﹐况且我们凭白无故了用了这么多0﹐真别扭(unicode中的前128位还是ASCII标准﹐只不过在前面加了8个0)﹐由于那些国家"势力"比较大﹐所以这个问题不容忽视

17.这个世界上的牛人总是这么多﹐这个问题很容易就被小意思地解决了。

18.想想GB2312怎么解决与ASCII兼容的问题的(1开头的就读2个字节﹐0开头的就读1个字节)﹐同样﹐UTF也这样﹐0开头的读1个字节(ASCII码)﹐110开头的读2个字节﹐1110开头的读3个字节﹐这就是伟大的UTF-8(当然还有UTF-16,原理一样﹐xx开头的读4个字节﹐xx开头的读5个字节﹐xx开头的读6个字节)

19.当然UTF-8没GB2312这么简单﹐读完之后不能直接查编码表﹐多加一个步骤﹐按照模板提取一下字符再查就OK了

以下就是UTF-8的模板
0x0000 - 0x007F用一个字节表示 0xxxxxxx
0x0080 - 0x07FF用两个字节表示 110xxxxx 10xxxxxx
0x0800 - 0xFFFF用三个字节表示 1110xxxx 10xxxxxx 10xxxxxx
举个例子吧,
如果你遇到了11100110 10110001 10001001 01000001 这样的字节流﹐首先你看第一个字节以1110开头﹐即读3个字节并按模板提取得到 0110 110001 001001(去除模板标志﹐再四字节四字节读即0x6c49),查unicode编码表就是"汉"字,而最后一个以0开头就一定是一个字节了﹐0x0041,也就是"A"。

20.好了﹐上面是原理﹐再来谈谈简繁体操作系统转换时的乱码问题吧

21.按照我的想法﹐windows操作系统应该有一个默认的系统字符集﹐如简体操作系统应该是GB码﹐繁体操作系统则是BIG5,英文操作系统是ASCII。系统内的软件(notepad)默认都是使用这个字符集。

22.所以我在繁体操作系统默认存储的文本文件就是BIG5了﹐当这个文件到了简体系统里﹐它的notepad程序则使用自己的默认编码(GB)来读取﹐这样就乱了。

23.因此如果在保存时就使用utf-8来保存﹐应该在两系统切换时就不会有问题了。

24.而要解决这个问题其实也很简单﹐只要知道这个文本文件原来的编码就可以了﹐使用它读出来﹐再转成unicode即可。


上面的东东都是我用自己的理解来解释的﹐当然有些东西我避开了﹐主要是想让大家更容易理解原理﹐想要更正式的内容大家到网上随便一搜就出来了。

 下篇文章使用.net来验证一下此内容

posted on 2006-07-13 09:55 小生 阅读(3640) 评论(17)  编辑 收藏 引用 网摘 所属分类: asp.net
<script type="text/javascript">//</script>

Feedback


牛人!讲的非常清楚。
只是有一点,针对你的23,我有一些疑问。
我在中文下用C#写程序,有个别中文字符,也有一些日文字符,默认保存为UTF-8,在日文下打开就是乱码。 你知道为什么这样吗?
  回复  更多评论
  

@鐙楃嫍
是全部亂﹐還是只是中文部分是亂碼呀?

是在vs.net中打開﹐還是notepad或其它應用程序呀?

有的程序像(UE v3.2,powerdesign)它好像只使用系統默認的編碼集(如big5)﹐當簡體漢字過來時﹐它還是不認識(用?表示),這些應該是和具體的軟件有關吧

你用notepad和vs.net看一下﹐它們好像是ok的  回复  更多评论
  

其實關于文件的編碼識別也不是很容易的﹐不過像utf-8有一個比較容易的識別方式﹐就是它會以EF、BB、BF開頭(但好像也不全是這樣)  回复  更多评论
  

我以前在vs2005里面的文件,一旦拿到国外的机器上就乱码。后来就是把文件另存为utf-8格式的,然后就ok了。
在这里终于找到原因了。
  回复  更多评论
  

支持独立思考,可以知道你的msn吗,希望可以多交流

<span style="color:red">如果你遇到了11100110 10110001 10001001 01000001 这样的字节流﹐首先你看第一个字节以1110开头﹐即读3个字节并按模板提取得到 0110 110001 001001(去除模板标志﹐再四字节四字节读即0x6c49),查unicode编码表就是"汉"字,而最后一个以0开头就一定是一个字节了﹐0x0041,也就是"A"。</span>

其中有一句应该是<br/>
<span style="color:red">再四比特比特节读</span>  回复  更多评论
  

@andkyKoenig
謝謝你的糾錯

我的msn是:tsoukw@hotmail.com  回复  更多评论
  

上篇blog讲了一下unicode等编码的问题﹐不过并没有涉及程序﹐所以这次就用.net来证实一下上次的这些东东。   查看原文  回复  <a title="查看该作者发表过的评论" href="http://www.cnblogs.com/comment?author=%e5%b0%8f%e7%94%9
# re: 编码,charset,乱码,unicode,utf-8简单释义 2006-07-13 10:06 lyanry
 
分享到:
评论

相关推荐

    pb9.0 UTF-8 编码转换为Unicode 编码格式

    PowerBuilder9.0开发环境下,可以把UTF-8的编码转换为Unicode的编码格式,在pb9.0环境下测试通过。

    Java解决UTF-8的BOM问题

    Java解决UTF-8的BOM问题,使用“UnicodeInputStream”、“UnicodeReader”。

    UTF-8 中文字符集表

    UTF-8 中文 字符集表 免费share UTF-8 ---&gt; Chinese Charset Table

    UTF-8_GB2312-Src

    三星手机电话本UTF-8与GB2312互换工具,方便阅读导出的UTF-8的VCF电话本文件,可以看到中文格式内容。也可以修改了再导回手机。不想用360或腾讯管家的可以用这个。有处理命令和示例可以参考

    UTF-8文件去除BOM头小工具

    去除bom头小工具,工具使用方法: 选择要遍历的文件夹,输入...勾选ANSI转为UTF-8,则会将相应格式但编码为GB2312,GBK,GB18030的文件转为无BOM的UTF-8文件 请确保文件可写!使用前请做好备份,作者不承担任何法律责任

    FSO生成UTF-8编码文件的解决方法

    昨天写一个生成天气预报的xml文件的程序,考虑到通用性,于是选择utf-8编码,我也比较偏好这个编码。最先想到用FSO来写这个xml文件,后来却发现生成的xml文件不能正常显示,仅仅是因为编码的原因。用记事本打开生成...

    selectersky gb2312和utf-8文件编码互换工具 v1.05

    本程序实现utf-8和gb2312编码互换 特色: 1、可以自定义要转换的文件扩展名 2、可以自定义要转换的文件的路径(相对,绝对) 3、自动识别编码格式 4、转换时自动将结果输出到指定的文件夹。不会覆盖原因的文件。...

    php页面,mysql数据库转utf-8乱码,utf-8编码问题总结

    charset=utf-8”); 2.PHP文件编码问题 点击编辑器的菜单:“文件”-&gt;“另存为”,可以看到当前文件的编码,确保文件编码为:UTF-8,如果是ANSI,需要将编码改成:UTF-8。 3.PHP文件头BOM问题: PHP文件一定不可以...

    最新支付宝接口(asp-支持UTF8、GB2312)

    支付宝接口签约地址(免费):... 这个接口UTF-8,GB2312编码都通用。(支付宝官方的只发出了GB2312版的。。)  用法很简单,直接调用类就可以了。 详细资料请查看“使用说明(必看).txt”,默认编码UTF-8

    utf-8编码引起js输出中文乱码的解决办法

    编码规则是utf-8,如网页头中的: &lt;meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ /&gt; 那么js文件中如果有中文输出就会出现乱码,解决此个问题有两个方法: 1、在引用javascript输出...

    utf-8 网页不显示+utf-8网页乱码的通用解决方法

    常常会发生这样的问题:在浏览使用UTF-8编码的网页时,浏览器无法自动侦测(即没有设定“自动选择”编码格式时)该页面所用的编码。即使网页已经声明过编码格式: &lt;meta http-equiv=”Content-Type” content=”...

    PHP乱码问题,UTF-8乱码常见问题小结

    charset=utf-8′ /&gt; 顺序不能错,一定要在 显示的标题有可能是乱码! 2.html文件编码问题: 点击编辑器的菜单:“文件”-&gt;“另存为”,可以看到当前文件的编码,确保文件编码为:UTF-8, 如果是ANSI,需要将编码...

    HTML5 UTF-8 中文乱码的解决方法

    复制代码代码如下: &lt;!... &lt;head&gt; &lt;meta charset=”UTF-8″&gt; &lt;title&gt;...用记事本写,保存后在网页上运行出现了乱码,换成GB2312能正确... 只是告诉浏览器要用utf-8来解释,而文档的编码,是在你保存时的

    myEclipse乱码解决办法

    一、将整个project设置编码UTF-8(UTF-8可以最大的支持国际化) windows-&gt;Preferences-&gt;general-&gt;Workspace-&gt;Text file encoding-&gt;Other框中的Text file encoding改为UTF-8。 二、对java源文件编码设置为UTF-8. ...

    文本文件编码转换工具 gbk utf8 gb2312

    charset=utf-8"&gt;&lt;/HEAD&gt; "说明此文件编码为utf8" 4)在 mysql_select_db("表名",$id); 后面加入一行 mysql_query("set names utf8;"); &lt;!-----说明数据库连接也用utf8编码-----&gt; 5)*.php 文件在存盘的时候也以 ...

    JSON版本2.6jar包

    SpringMVC4.2中JSON解析使用1.9 会出现application/json;charset=UTF-8' not supported 可能是包的版本的问题。这里上传一个JSON包2.6版本的

    ASP同一站点下gb2312和utf-8页面传递参数乱码的终极解决方法

    页面文件使用正确的编码,gb2312使用ANSI,utf-8使用utf-8; ②.ASP代码中设置正确的CODEPAGE,gb2312使用936,utf-8使用65001; ③.HTML代码中设置正确的charset,gb2312使用gb2312,utf-8使用utf-8; ④.将传递的...

    JS失效 提示HTML1114: (UNICODE 字节顺序标记)的代码页 utf-8 覆盖(META 标记)的冲突的代码页 utf-8

    经过分析发现,这个是因为页面中html与js编码不一致导致的,一般情况最好统一标准的utf8的 ...meta http-equiv="Content-Type" content="text/html charset=UTF-8" /&gt; [removed][removed] [removed]&lt;/s

    ASP生成静态文件编码为UTF-8格式的HTML文件

    8″也是没用的 要生成utf-8格式的文件,ASP环境下我们用 ADODB.Stream代替FSO读写utf-8文件,因为,ADODB.Stream,有一个CharSet 属性,可以让您定义要打开或要写入的文件的编码类型,这样一来,ADODB.Stream不仅仅...

    http/https请求工具类

    charset=utf-8"; public static String MIME_TYPE_XML = "application/xml;charset=utf-8"; public static String MIME_TYPE_JSON = "application/json;charset=utf-8"; public static String MIME_TYPE_TEXT...

Global site tag (gtag.js) - Google Analytics