`

编码,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
 
分享到:
评论

相关推荐

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

    由于UTF-8编码的特殊性和JavaScript处理字符串的方式,当在网页中使用UTF-8编码时,可能会遇到JavaScript输出中文字符显示为乱码的问题。这个问题通常出现在网页内容或JavaScript文件编码与浏览器解析的编码不一致时...

    UNICODE_2.00_编码转换.rar

    本文将深入探讨“UNICODE_2.00_编码转换.rar”文件所涉及的编码概念,包括Text、ANSI、Unicode、UCS-2、UTF-8以及UTF-7,并解释如何进行汉字转UCS-2格式的转换。 1. **Text编码**:在计算机早期,"Text"通常指基于...

    html转utf8转码器

    早期的ASCII编码只支持英文字符,但随着全球化的发展,Unicode字符集(包括UTF-8)被广泛采用,因为它能表示包括中文、日文、韩文等在内的各种语言字符。 HTML文件本身是纯文本文件,其编码格式会影响浏览器如何...

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

    页面的META标签声明了UTF-8编码,但第二个JavaScript文件引用中又单独指定了编码为UTF-8。这种重复的编码声明可能导致浏览器解析上的混淆。作者还提供了解决问题的方法:移除JavaScript文件引用中多余的charset="UTF...

    C++11 Unicode编码转换

    例如,使用`-finput-charset=utf-8`选项告诉编译器源代码是UTF-8编码,但如果实际编码是GBK,编译器的转换可能会失败,导致输出错误的字符。 - **输出环境**:输出设备(如终端或控制台)需要支持特定编码的显示。...

    Code:Blocks-中文乱码问题原因分析和解决方法1

    - **控制台设置**:在Windows环境下,可以通过修改控制台属性设置,将其字符集更改为支持Unicode的编码,如`chcp 65001`切换到UTF-8编码。 对于Tiny C,由于它不完全支持宽字符集,`wprintf`函数可能无法正常显示宽...

    tomcat字符编码总结

    1. **客户端(浏览器)**: 根据HTML页面声明的编码方式(如`&lt;meta charset="UTF-8"&gt;`)来解释数据。 2. **发送请求**: 当用户提交表单或点击链接时,浏览器根据页面的编码方式对数据进行编码。 3. **到达服务器**: ...

    教学视频--JSP中URL传递中文乱码问题的解决演示.rar

    charset=UTF-8" %&gt;`来指定页面的编码格式为UTF-8。 2. **URL编码**:在传递中文参数前,使用Java的`java.net.URLEncoder.encode()`方法对中文参数进行编码,指定编码格式为UTF-8。例如:`URLEncoder.encode("中文...

    Java Web编程中中文信息处理出现乱码的研究 (1).pdf

    - **Unicode(UTF-8)**:包含世界多种语言的字符集,每个字符有一个唯一的数字表示,支持多语言环境。 2. 乱码产生的原因: - **请求与响应编码不一致**:HTTP请求和响应中的编码格式如果不匹配,会导致中文字符...

    jspdf中文乱码解决方法.zip

    'charset': 'utf-8' }); ``` 5. 更新版本:确保你正在使用的jspdf库是最新的,因为旧版本可能存在的bug可能导致中文乱码问题。可以查看官方GitHub仓库获取最新版本。 总结起来,解决jspdf中文乱码的关键步骤包括...

    mysql.rar_JSP+Mysql_中文乱码

    在创建数据库和表时,应选择支持UTF-8的字符集,如`utf8mb4`,它是MySQL对UTF-8的扩展,能处理更多的Unicode字符。创建表时可以这样指定: ```sql CREATE TABLE `test` ( ... ) ENGINE=InnoDB DEFAULT CHARSET=...

    JSP中文乱码解决方法

    表单提交中文乱码的问题,主要由于HTTP请求默认使用的是ISO-8859-1编码,这与中文字符的编码(如UTF-8或GB2312)不匹配,导致传输过程中字符被错误解释。 **解决方案:** 在处理表单数据前,调用`request.set...

    Java Web开发中的中文乱码问题分析及解决方案.pdf

    Unicode编码是一种通用编码,涵盖了所有语言,而UTF-8编码则是一种变长编码,它兼容ISO8859-1和Unicode,并且在处理英文和中文混合的文本时更为灵活。 在Java Web环境中,编码机制复杂,涉及客户端、服务器端、HTTP...

    Web开发中乱码问题的研究与解决.pdf

    常见的字符编码标准包括ASCII编码、ANSI编码(如GB2312、GBK等)和Unicode编码(如UTF-8)。 ##### 2.1 ASCII编码(单字节) ASCII编码是最早被广泛使用的字符编码标准之一,它采用7位二进制数来表示一个字符,共...

    免费 java中文乱码字符集处理大全.docx

    4. 浏览器通常使用UTF-8编码来传递参数,与某些系统或程序使用的编码格式不一致,这也可能导致中文乱码。 5. 不同类型的Java程序(如Console应用、JSP、Servlets、EJB等)在接收和输出中文字符时,都会涉及编码和...

    java中各种编码转换.pdf

    3. **UTF-8**:这是一种变长的Unicode编码,可以表示Unicode字符集中所有的字符。UTF-8在互联网上广泛使用,因为它能很好地兼容ASCII,并且在大多数情况下,每个英文字符只占一个字节。 4. **UTF-16BE (Big Endian)...

    JAVA字符编码系列三[借鉴].pdf

    文章通过“中文”二字举例,解释了不同编码方式如GB2312、Unicode、UTF-8的表示方法。 1. **编码基本知识** - ISO8859-1是一种单字节编码,适用于英文,最多表示256个字符,不支持中文。 - GB2312和GBK是中文的...

    linux 下 JFreeChart 乱码 JDK字符集

    - **修改JFreeChart编码**:在生成图表时,可以通过设置`TextRenderer`的`charset`属性为`UTF-8`来改变JFreeChart的编码。 ```java DefaultCategoryAxis axis = (DefaultCategoryAxis) chart.getCategoryPlot()....

    编码转换.7z

    UTF是Unicode的实现方式,包括UTF-8、UTF-16、UTF-32等,其中UTF-8是最常用的一种,因为它具有良好的向前兼容性和空间效率。 7. **Web中的编码**:在网页中,HTML文档的编码通常通过`&lt;meta&gt;`标签指定,如`&lt;meta ...

    多线程出现中文乱码的例子

    在计算机中,字符是通过特定的编码方式(如ASCII、Unicode的UTF-8等)来表示的。如果在读取、写入或传输过程中编码不一致,就可能导致乱码现象。例如,在Java中,默认的字符编码可能与实际存储或接收的数据编码不同...

Global site tag (gtag.js) - Google Analytics