论坛首页 编程语言技术论坛

研究了一下字符编码

浏览 20009 次
精华帖 (0) :: 良好帖 (5) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-06-16  

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


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

 

    字节(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成相应的字符编码。

 

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

 

   发表时间:2010-06-20  
期待LZ接下来的文章~
0 请登录后投票
   发表时间:2010-06-22  
期待··  我也蛮感兴趣。

目前Coding中主要都是UTF-8, 感觉已经成为了惯例。

因为见到过多次情况,特别是项目配置管理迁移时Encoding的设置问题。
0 请登录后投票
   发表时间:2010-06-23  
UTF-8应该是主流了吧,抛弃GBK吧
0 请登录后投票
   发表时间:2010-06-23  
utf-8太恶心,中文用三字节,还是使用gbk吧。多国语言支持通常都是一种过度设计与奢侈。
0 请登录后投票
   发表时间:2010-06-23  
tongxiaobai 写道
UTF-8应该是主流了吧,抛弃GBK吧

感觉有中文的还是gbk好,字符集容量大啊……
0 请登录后投票
   发表时间:2010-06-24  
yangguo 写道
utf-8太恶心,中文用三字节,还是使用gbk吧。多国语言支持通常都是一种过度设计与奢侈。

谁跟你说的一定是三个啊
0 请登录后投票
   发表时间:2010-06-24  
jojo_java 写道
yangguo 写道
utf-8太恶心,中文用三字节,还是使用gbk吧。多国语言支持通常都是一种过度设计与奢侈。

谁跟你说的一定是三个啊

谁跟你说不是?
0 请登录后投票
   发表时间:2010-06-24  
U+00000000 – U+0000007F 0xxxxxxx
U+00000080 – U+000007FF 110xxxxx 10xxxxxx
U+00000800 – U+0000FFFF 1110xxxx 10xxxxxx 10xxxxxx
U+00010000 – U+001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U+00200000 – U+03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U+04000000 – U+7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

------
http://en.wikipedia.org/wiki/GBK#GBK Encoding Ranges
0 请登录后投票
   发表时间:2010-06-25  
utf-8是3个字节?
我一直以为是2个...
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics