`
smartzxy
  • 浏览: 199792 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

研究了一下字符编码

阅读更多

    凡是在应用中涉及到中文了,都会遇到字符编码问题。之前没有仔细研究,脑中只有一个比较敷衍的概念——在交互中统一字符编码就不会出问题了~具体字符编码会出什么问题,一直没好好研究下。(今早看到华莽邮件里又有人为了字符编码抓狂了,同情下……)


    首先要清楚一下几个概念:

 

    字节(byte):计算机中存储数据的单元,一个8位的二进制数,是一个很具体的存储空间。

    字符(Character):是文字与符号的总称,包括文字、图形符号、数学符号等。

    字符集(Charset):即字符的集合,规定了在这些集合里面有哪些字符。

    字符编码(Encoding):就是规定用一个字节还是多个字节来存储一个字符,用固定的二进制码值表示某个字符。


     目前常见的字符集有ASCII、ISO-8859-1、Unicode、GB2312、GBK、BIG5等。各自都有各自的编码方式,比如“中华”这个词在GBK中编码为:“\xd6\xd0\xbb\xaa”,在Unicode中为:“\u4e2d\u534e”。当然各自的特性也不同,这里就不介绍了。


     在所有这些字符集中,Unicode比较特殊,因为它的野心比较大,想囊括所有语言的字符作为统一字符集,所以编码就不能只用小小一个字节了,所有它能表示的字符都编码为两个字节。但是英语系的家伙们不干了,他们的语言仅仅26个字母,也要用2个字节来编码,传输时岂不是浪费大了!于是想出了UTF-8、UTF-16等针对Unicode的二次编码方式。UTF-8对传统ASCII字符用一个字节来编码,对中文这样的字符用3个字节来编码(我们亏了~)。


     出现乱码问题主要在数据的表现上,也就是显示设备在根据数据中的字符编码值找出相应的字符并加以显示时,使用了错误的编码方式。这个问题只要在通信中交互数据时标记清楚数据所使用的编码方式。在xml中,可以设置:

<?xml version="1.0" encoding="UTF-8"?>

 

     在HTTP传输中可以在报头设置字符集编码方式,HTML也可以标记字符编码,这样浏览器就会自动选择了……


     字符编码不仅仅会引起乱码麻烦,在数据处理中也会惹麻烦。例如Python在“对外”(包括标准输出流)发送Unicode编码的文本数据时,会默认的使用ASCII字符集的codecs将字符转换成ASCII编码,如果含有非ASCII字符集的字符,就会报“UnicodeEncodeError”;在比较Python中的字符串时,如果使用的编码不同,也会报UnicodeEncodeError异常………所以比较乖的方式就像《Python Cookbook》中建议的,在发生IO动作时,I时将数据decode成Unicode,O时再将数据encode成相应的字符编码。

 

     以上是今天下午的学习心得……

 

分享到:
评论
29 楼 苏小脉 2010-10-22  
wait10000y 写道
utf8是可变字节长度保存的,不同字符集占字节长度不同;
linux 系统 默认 utf-8;
windows 系统 默认 gbk ;
对中文来说 用这两个中的哪个都一样的。


这个不是绝对的,locale 的设置决定了系统当前使用的代码页,像 GBK 只不过恰好是 PRC 区域设置的代码页而已。
28 楼 kevintse 2010-10-18  
http://www.joelonsoftware.com/articles/Unicode.html
看看这篇文章会有很大的帮助.

另外,楼主所说的"但是英语系的家伙们不干了,他们的语言仅仅26个字母,也要用2个字节来编码,传输时岂不是浪费大了!于是想出了UTF-8、UTF-16等针对Unicode的二次编码方式。"有点问题~

"于是想出了UTF-8、UTF-16等针对Unicode的二次编码方式。",实际上他们只想出了UTF-8,也不叫二次编码,而是Unicode标准的一个实现.
Unicode并不是一种编码,而是一个标准,但是当人们说使用Unicode的时候,他们说的是UTF-16.所以,你又可以认为Unicode=UTF-16.

GBK都是两个字节的,但是因为GBK兼容ISO-8859-1(ASCII),所以,表示ASCII字符的时候,就只需要一个字节.
中文在UTF-8里面都是占用3个字节的.UTF-8的出现就是为了解决UTF-16总是占用两个字节,太浪费存储空间的问题.
27 楼 liangguanhui 2010-09-16  
utf8的长度是1-6,其中4-6的长度是为了支持UCS4,而1-3的长度支持UCS2,目前常用的是UCS2。

通常在UT8,中文都是三个字节表示,这个应该算是常识那。
26 楼 nkranber 2010-09-15  
用UTF8还是用GBK不能一概而论啊,主要还得看网站的带宽和使用的平台。例如:WAP网站私底下还是认为用GBK比较好,而网络就无所谓了。
25 楼 laobian 2010-08-14  
全部采用encode和decode就不会有乱码了嘛,吵啥呀?
24 楼 wait10000y 2010-07-03  
utf8是可变字节长度保存的,不同字符集占字节长度不同;
linux 系统 默认 utf-8;
windows 系统 默认 gbk ;
对中文来说 用这两个中的哪个都一样的。
23 楼 smartzxy 2010-07-03  
i2534 写道
在我看来,除了UTF-8,其他一切区域性的编码都可以在程序员的世界里抛弃了.我上个公司给移动做一个国际邮件处理,遇到的乱码问题真是匪夷所思,很多都是无解的,当然,也和发送的客户端有关,让人要抓狂.

是啊,Unicode已经完全包含了gbk的字符集,最新的Unicode已经涵盖了gb18030,除了utf-8的3字符表示不太舒服外,没什么不好的了~
22 楼 i2534 2010-06-30  
在我看来,除了UTF-8,其他一切区域性的编码都可以在程序员的世界里抛弃了.我上个公司给移动做一个国际邮件处理,遇到的乱码问题真是匪夷所思,很多都是无解的,当然,也和发送的客户端有关,让人要抓狂.
21 楼 hesy_007 2010-06-29  
lei_1021 写道
无语了,谁告诉你utf-8是用三个字节表示中文啊,UTF-8编码是根据字符不同所占的长度也不同,从一个字节到四个字节不等

UTF-8的编码长度是可变的。但是就目前来说,中文基本上是三个字节表示,英文等拉丁语言两个字节,其他一些用四个字节。
20 楼 J-catTeam 2010-06-29  
开发中经常遇到编码的问题,UTF-8是合理的
19 楼 thethinking 2010-06-29  
IcedCoffee 写道
utf-8是3个字节?
我一直以为是2个...

我也一直以为是2个,但是前阵子使用Yii。里面验证字段长度,发现中文按3个字节计算的,当时有些纳闷但是也没深究。不求甚解啊!
18 楼 whitesock 2010-06-29  
UTF8是可变长的编码方式,这个想必大家都清楚,用不着摘个繁体维基百科。
17 楼 yining159 2010-06-28  
whitesock 写道
jojo_java 写道
yangguo 写道
utf-8太恶心,中文用三字节,还是使用gbk吧。多国语言支持通常都是一种过度设计与奢侈。

谁跟你说的一定是三个啊

谁跟你说不是?

對於UTF-8編碼中的任意位元組B,如果B的第一位為0,則B為ASCII碼,並且B獨立的表示一個字元;

如果B的第一位為1,第二位為0,則B為一個非ASCII字元(該字元由多個位元組表示)中的一個位元組,並且不為字元的第一個位元組編碼;

如果B的前兩位為1,第三位為0,則B為一個非ASCII字元(該字元由多個位元組表示)中的第一個位元組,並且該字元由兩個位元組表示;

如果B的前三位為1,第四位為0,則B為一個非ASCII字元(該字元由多個位元組表示)中的第一個位元組,並且該字元由三個位元組表示;

如果B的前四位為1,第五位為0,則B為一個非ASCII字元(該字元由多個位元組表示)中的第一個位元組,並且該字元由四個位元組表示;
摘自 维基百科http://zh.wikipedia.org/zh-tw/UTF-8
16 楼 蓝皮鼠 2010-06-27  
对于汉字来说,utf-8基本是三个字节表示的
System.out.println("汉字".getBytes("UTF-8").length);
System.out.println("汉字".getBytes("GBK").length);


上面的代码输出是6和4。
有疑问的可以用任意的中文试试。

程序员对程序有疑问时,请直接问电脑,不用自己猜。。。
15 楼 xiaolongfeixiang 2010-06-26  
<div class="quote_title">lei_1021 写道</div>
<div class="quote_div">无语了,谁告诉你utf-8是用三个字节表示中文啊,UTF-8编码是根据字符不同所占的长度也不同,从一个字节到四个字节不等</div>
<p> </p>
<p>不要总是“谁告诉你”、“一直都是”、“一直都不是”,这样不是在讨论,不会有结果的。</p>
<p> </p>
<p>看证据:</p>
<p> </p>
<p><a href="http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chapter/charset.html#charset-metadata">http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chapter/charset.html#charset-metadata</a></p>
<p> </p>
<p>10.5节,Unicode支持。</p>
<p> </p>
<p><br><img src="http://dl.iteye.com/upload/attachment/269233/7e8b87f1-dae6-314f-a779-fc760af414af.jpg" alt=""></p>
14 楼 lei_1021 2010-06-26  
无语了,谁告诉你utf-8是用三个字节表示中文啊,UTF-8编码是根据字符不同所占的长度也不同,从一个字节到四个字节不等
13 楼 lilsean 2010-06-26  
<div class="quote_title">xiaolongfeixiang 写道</div>
<div class="quote_div">
<div class="quote_title">jojo_java 写道</div>
<div class="quote_div">
<div class="quote_title">yangguo 写道</div>
<div class="quote_div">utf-8太恶心,中文用三字节,还是使用gbk吧。多国语言支持通常都是一种过度设计与奢侈。</div>
<br>谁跟你说的一定是三个啊</div>
<p> </p>
<p>jojo_java兄弟,看书要仔细点。</p>
<p> </p>
<p><span style="color: #ff0000;"><strong>utf8的编码集中,汉字是3个字符。</strong></span></p>
<p> </p>
<p>utf-8是1-4个字节的变长编码:</p>
<p> </p>
<p><strong><span style="color: #0000ff;"><span>·<span>         </span></span>基本拉丁字母、数字和标点符号使用一个字节。</span></strong></p>
<p><strong><span style="color: #0000ff;"><br></span></strong></p>
<p><strong><span style="color: #0000ff;"><span>·<span>        
</span></span>大多数的欧洲和中东手写字母适合两个字节序列:扩展的拉丁字母(包括发音符号、长音符号、重音符号、低音符号和其它音符)、西里尔字母、希腊语、亚美尼亚语、希伯来语、阿拉伯语、叙利亚语和其它语言。</span></strong></p>
<p><strong><span style="color: #0000ff;"><br></span></strong></p>
<p><strong><span style="color: #0000ff;"><span>·<span>         </span></span>韩语、中文和日本象形文字使用三个字节序列。</span></strong></p>
</div>
<p>我得好好看看了</p>
12 楼 xiaolongfeixiang 2010-06-26  
<div class="quote_title">jojo_java 写道</div>
<div class="quote_div">
<div class="quote_title">yangguo 写道</div>
<div class="quote_div">utf-8太恶心,中文用三字节,还是使用gbk吧。多国语言支持通常都是一种过度设计与奢侈。</div>
<br>谁跟你说的一定是三个啊</div>
<p> </p>
<p>jojo_java兄弟,看书要仔细点。</p>
<p> </p>
<p><span style="color: #ff0000;"><strong>utf8的编码集中,汉字是3个字符。</strong></span></p>
<p> </p>
<p>utf-8是1-4个字节的变长编码:</p>
<p> </p>
<p><strong><span style="color: #0000ff;"><span>·<span>         </span></span>基本拉丁字母、数字和标点符号使用一个字节。</span></strong></p>
<p><strong><span style="color: #0000ff;"><br></span></strong></p>
<p><strong><span style="color: #0000ff;"><span>·<span>        
</span></span>大多数的欧洲和中东手写字母适合两个字节序列:扩展的拉丁字母(包括发音符号、长音符号、重音符号、低音符号和其它音符)、西里尔字母、希腊语、亚美尼亚语、希伯来语、阿拉伯语、叙利亚语和其它语言。</span></strong></p>
<p><strong><span style="color: #0000ff;"><br></span></strong></p>
<p><strong><span style="color: #0000ff;"><span>·<span>         </span></span>韩语、中文和日本象形文字使用三个字节序列。</span></strong></p>
11 楼 whitesock 2010-06-26  
hozaka 写道
whitesock 写道
jojo_java 写道
yangguo 写道
utf-8太恶心,中文用三字节,还是使用gbk吧。多国语言支持通常都是一种过度设计与奢侈。

谁跟你说的一定是三个啊

谁跟你说不是?


一直都不是,参考 http://en.wikipedia.org/wiki/UTF-8

引用

UTF-8 (8-bit UCS/Unicode Transformation Format) is a variable-length character encoding for Unicode. It is able to represent any character in the Unicode standard, yet is backwards compatible with ASCII. For these reasons, it is steadily becoming the preferred encoding for e-mail, web pages,[1][2] and other places where characters are stored or streamed.

UTF-8 encodes each character (code point) in 1 to 4 octets (8-bit bytes), with the single–octet encoding used only for the 128 US-ASCII characters.

你再仔细看看吧
10 楼 hozaka 2010-06-25  
whitesock 写道
jojo_java 写道
yangguo 写道
utf-8太恶心,中文用三字节,还是使用gbk吧。多国语言支持通常都是一种过度设计与奢侈。

谁跟你说的一定是三个啊

谁跟你说不是?


一直都不是,参考 http://en.wikipedia.org/wiki/UTF-8

引用

UTF-8 (8-bit UCS/Unicode Transformation Format) is a variable-length character encoding for Unicode. It is able to represent any character in the Unicode standard, yet is backwards compatible with ASCII. For these reasons, it is steadily becoming the preferred encoding for e-mail, web pages,[1][2] and other places where characters are stored or streamed.

UTF-8 encodes each character (code point) in 1 to 4 octets (8-bit bytes), with the single–octet encoding used only for the 128 US-ASCII characters.

相关推荐

    易语言字符编码转换

    通过深入研究和理解这个易语言字符编码转换源码,开发者不仅可以掌握字符编码的基本概念,还能学习到易语言的具体应用技巧,这对于开发涉及跨平台文本处理或需要与不同编码系统交互的项目非常有帮助。同时,这也是一...

    字符编码和字符集研究

    字符编码和字符集是计算机处理文字和符号的基础。字符集是指一组特定的字符集合,它包含文字、符号、数字等元素。例如,英文字符集包含了所有的英文字母和符号,而汉字字符集则包含了所有汉字。字符集可以是某个语言...

    字符编码文档

    ### 字符编码与Unicode标准:理解CJK统一汉字 在探讨字符编码的世界时,我们不可避免地会遇到Unicode这一全球性标准,尤其是当涉及到中文、日文和韩文(统称为CJK)字符时。本文将深入解析《字符编码文档》中关于...

    Java字符编码及获取文件编码

    在Java编程语言中,字符编码是一个至关重要的概念,它涉及到数据的存储、处理和传输。字符编码决定了如何将字符(如字母、数字、符号)转换为数字表示,以便计算机能够理解并操作它们。本篇文章将深入探讨Java中的...

    字符编码-使用c#研究

    ### 字符编码基础及C#中的应用 #### 一、字符编码概述 在计算机科学领域,字符编码是一项基本且至关重要的技术,它涉及到如何将人类可读的文字转换为计算机能够处理的数据格式。根据Joel Spolsky的观点,“每一位...

    tomcat字符编码总结

    通过对Tomcat环境下字符编码问题的研究,我们可以得出以下几点结论: - 统一编码标准是避免乱码的关键,建议在Tomcat及其应用中统一使用UTF-8编码。 - 对于不同的请求方式,应采取不同的策略来处理字符编码问题。 -...

    简单的文字字符编码加密

    在IT领域,字符编码与加密是信息安全的重要组成部分。本文将基于标题“简单的文字字符编码加密”和描述,探讨字符编码的基础知识以及一个简单的加密过程。字符编码是指将字符转化为二进制数字的过程,以便计算机能够...

    Java网络传输中字符编码问题的研究

    Java网络传输中的字符编码问题主要涉及到Java编程语言在处理不同编码格式时的转换和兼容性。Java语言本身采用Unicode字符集,这是一种国际化的标准,能够支持世界上大多数语言,包括中文。然而,在实际的网络环境中...

    ASCII中英文字符编码查询器

    这是一款字符编码转换器,输入中文,可以输出对应的ASCLL编码,二进制,八进制,十六进制等。 #include int main() { int i; printf("%c%c%c%c%c%c\n",206,210,176,174,196,227); return 0; } 输出内容是:我爱你...

    matlab开发-算术编码字符串

    在IT领域,算术编码是一种高效的数据压缩方法,尤其在文本和图像编码中广泛应用。它基于概率模型,通过连续实数...通过对这个项目的研究,不仅可以理解算术编码的原理,还能掌握如何在实际应用中实现这一高效压缩技术。

    JIS标准编码字符汇总文件包

    《JIS标准编码字符汇总文件包》是针对日文字符编码的一个重要资源,它涵盖了多种JIS(Japanese Industrial Standards)编码体系,对于理解和处理日文文本具有极高的价值。JIS编码是日本广泛采用的标准,它规定了字符...

    所有UNICODE字符的编码表

    总结来说,Unicode字符编码表是一个至关重要的工具,它为全球的信息交流提供了统一的标准,无论你是编写软件、设计网站,还是进行语言学研究,理解并掌握Unicode编码表都将极大地提高你的工作效率和准确性。...

    DICOM标准下中文字符表示及编码的研究与实践

    ### DICOM标准下中文字符表示及编码的研究与实践 ...通过合理选择字符编码方式、优化软件开发流程以及积极参与标准化工作,可以有效地解决当前存在的问题,并促进DICOM标准在中国及其他非英语国家的普及与发展。

    5个各类型字符编码项目源码.rar

    字符编码在IT行业中扮演着至关重要的角色,它是计算机理解和处理文本的基础。本资源包含五个不同类型的字符编码项目源码,采用...通过深入研究这些代码,你将能够更好地应对字符编码相关的挑战,提高你的软件开发水平。

    字符编码 大全

    深入研究字符集编码,不仅可以帮助理解不同编码方式之间的差异,还能促进跨平台和跨语言环境下的数据交换和处理。例如,了解 GB18030 与 UTF-8 之间的差异对于实现中文网页的国际化非常重要。 综上所述,字符编码的...

    JAVA 转换字符编码工具

    在IT行业中,字符编码是一个非常重要的概念,尤其是在处理多语言或者跨平台的数据交换时。`JAVA 转换字符编码工具`显然是一款...对于理解和使用这个工具,以及深入研究字符编码转换,这两个类的源码将是至关重要的。

    字符编码查看器.zip易语言程序源码资源下载

    对于有一定经验的程序员,这个程序源码则提供了深入研究字符编码和易语言程序设计的机会。 总之,字符编码查看器易语言程序源码资源是一份宝贵的教育资源,无论是用于毕业设计,还是作为编程学习的参考资料,都能为...

    Java及相关字符集编码问题研究

    Unicode是一种通用的字符编码方案,旨在提供所有语言文字的统一编码。它使用16位或32位编码,理论上可以表示超过百万种字符。UTF-8是Unicode的一种变长编码方式,兼容ASCII,广泛应用于互联网上的数据传输。 #### ...

    汉字字符编码(utf-8 unicode gb2312)

    汉字字符编码是计算机处理汉字时的关键技术,涉及到不同的编码标准,如UTF-8、Unicode和GB2312。这些编码方式各有特点,各有应用场景,理解它们有助于在处理中文字符时避免乱码问题。 首先,让我们来详细了解这些...

Global site tag (gtag.js) - Google Analytics