实例探究字符编码:unicode,utf-8,default,gb2312 的区别

简介:
 最近做邮件收发,不同的邮件系统间可能会出现编码问题,迫使我重新回来研究一下字符的编码问题,unicode,utf-8,gb2312这些编码格式都是我们熟知的,default 编码格式是哪一种呢?我们用实例来看看:

          
复制代码
  string  str  =   " china,中华人民共和国 " ;
            
byte [] bufferutf8  =  system.text.encoding.utf8.getbytes(str);
            printbyte(
" utf8: " , bufferutf8);


            
byte [] bufferunicode  =  system.text.encoding.unicode.getbytes(str);
            printbyte(
" unicode: " , bufferunicode);


            
byte [] bufferdefault  =  system.text.encoding. default .getbytes(str);
            printbyte(
" default: " , bufferdefault);


            
byte [] buffergb2312  =  system.text.encoding.getencoding ( " gb2312 " ).getbytes(str);
            printbyte(
" gb2312: " , buffergb2312);
复制代码

 

    下面是输出结果:
utf8:   string length:27,code: 
67 104 105 110 97 44 228 184 173 229 141 142 228 186 186 230 176 145 229 133 177 229 146 140 229 155 189 
unicode:string length:26,code: 
67 0 104 0 105 0 110 0 97 0 44 0 45 78 78 83 186 78 17 108 113 81 140 84 253 86 
default:string length:20,code: 
67 104 105 110 97 44 214 208 187 170 200 203 195 241 185 178 186 205 185 250 
gb2312: string length:20,code: 
67 104 105 110 97 44 214 208 187 170 200 203 195 241 185 178 186 205 185 250 

大家看到了,在这个实例中,uft-8格式编码所占字节是最长的,gb2312最短,unicode稍次。再仔细看看utf-8对于"china,"这6个字符的编码:
67 104 105 110 97 44 
gb2312 和 default 编码结果也是这样;

而unicode的编码是:
67 0 104 0 105 0 110 0 97 0 44 0
unicode 编码在英文字符后都补充了一个0,所以unicode是典型的双字节编码,它不区分是英文还是中文,统统用两个字节表示一个字符。

所以,utf-8,gb2312等编码都是“变长编码”的,但是对于中文的编码处理上,gb2312所需的字节更少。
而default 编码,则取决于当前系统编码,比如我们的操作系统安装的时候默认选择的都是“简体中文”(gb2312),所以测试中也证实了当前的环境编码格式

gb2312=default

    因此,我们在使用国外开源的代码的时候,一定要注意编码的问题,如果他们处理字符的时候使用的是ascii,我们使用肯定会出问题,如果使用的是 default,也要当心,他们理解的default是ascii,在对程序后续处理上可能不是我们期望的,也可能会出问题。
    最近的邮件收发我使用了国外的开源项目 openpop 和 opensmtp ,就曾经遇到了编码问题,希望大家以后 使用国外的开源代码对字符编码问题一定要引起注意。

那么我们究竟应该选择何种编码?这取决于实际情况,参看http://faq.csdn.net/read/210325.html (关于unicode和utf8,utf16等)
这篇文章,建议说:

使用utf-8编码,可以使unicode编码的大多数为英文字符(<0x7f)的字符串占用的空间最少,但是使双字节的unicode字符(比如中文)表示来需要三个字节,比起纯粹的双字节表示的unicode字符串来说,各有利弊吧

有关编码的具体定义和关系,请看:
http://zhidao.baidu.com/question/2692826.html (utf8和unicode编码究竟是什么关系?有何区别?)


    本文转自深蓝医生博客园博客,原文链接:http://www.cnblogs.com/bluedoctor/archive/2010/10/28/1863298.html,如需转载请自行联系原作者

相关文章
|
4月前
|
自然语言处理 JavaScript 程序员
UTF-8 GBK UTF8 GB2312 之间的区别和关系
【8月更文挑战第24天】UTF-8(Unicode Transformation Format-8bit)是一种多字节编码方案,用于解决国际化字符编码问题,英文使用一个字节编码,中文使用三个字节。它涵盖了全球所有国家的字符,具备良好的通用性,可在支持UTF-8的浏览器上显示。尽管可包含字节顺序标记(BOM),但通常不使用。GBK是在GB2312基础上扩展的标准,使用双字节编码,包括所有中文字符,但通用性较弱。UTF-8和GBK之间需通过Unicode转换。对于含有大量英文字符的网站或论坛,使用UTF-8编码可节省存储空间。
110 5
|
4月前
|
自然语言处理 Unix Linux
字符编码问题之UTF-16和UCS-2的关系如何解决
字符编码问题之UTF-16和UCS-2的关系如何解决
105 1
|
4月前
字符编码问题之UTF-16支持超过6w多个码点的如何解决
字符编码问题之UTF-16支持超过6w多个码点的如何解决
45 0
|
7月前
|
存储 自然语言处理 关系型数据库
👨‍💻如何使用MySQL存储Emoji表情,UTF-8和UTF-8MB4字符编码有何区别?
👨‍💻如何使用MySQL存储Emoji表情,UTF-8和UTF-8MB4字符编码有何区别?
195 1
|
关系型数据库 MySQL
MySQL的校对规则设置为 utf8mb4_unicode_ci是干什么的?底层原理是什么?
MySQL的校对规则设置为 utf8mb4_unicode_ci是干什么的?底层原理是什么?
240 0
|
JavaScript Java 数据库
UTF-8 GBK UTF8 GB2312之间的区别和关系,Java中String和byte[]间的转换,byte 是怎样转为汉字,汉字转byte的;char与
UTF-8 GBK UTF8 GB2312之间的区别和关系,Java中String和byte[]间的转换,byte 是怎样转为汉字,汉字转byte的;char与
364 0
UTF-8 GBK UTF8 GB2312之间的区别和关系,Java中String和byte[]间的转换,byte 是怎样转为汉字,汉字转byte的;char与
|
存储 关系型数据库 MySQL
utf8编码和utf8mb4编码(其它编码简介)
utf8编码和utf8mb4编码(其它编码简介)
399 0
.NET 字符串 编码转换 GB2312 UTF8
将 gb2312 转换 utf8 编码 private void button1_Click(object sender, System.EventArgs e) {  byte[] temp;  //将 textBox1.
1622 0
|
Web App开发 存储 Windows
字符编码知识:Unicode、UTF-8、ASCII、GB2312等编码之间是如何转换的?
转自:  http://apps.hi.baidu.com/share/detail/17798660 字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得字符编码的知识。不注意的人可能对这个不在意,但这些名词有时候实在让人迷惑,对想学习计算机知识的人来说,搞懂它也十分重要,我也是在学习中慢慢了解了一些这方面的知识。
1917 0