实例探究字符编码: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编码究竟是什么关系?有何区别?)

utf8和unicode编码究竟是什么关系?有何区别?

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏菩提树下的杨过

bash/shell编程学习(1)

1)定义变量 myvar=abc #注:等号前后不能加空格 #或 myvar="abc" #或 myvar='abc' #注:如果变量后面的值中间本身没有空格,...

20290
来自专栏章鱼的慢慢技术路

Linux操作_grep/egrep工具的使用

15570
来自专栏海说

深入理解计算机系统(3.3)---数据传送(或者说复制)指令详解

  上一章我们已经介绍了汇编语言的基础部分,包括数据格式、寄存器以及操作数的标识方式,接下来我们就应该去认识一下汇编语言当中的各个指令了。这些指令大多数都非常简...

10450
来自专栏微信公众号:Java团长

Java虚拟机体系结构

  众所周知,Java支持平台无关性、安全性和网络移动性。而Java平台由Java虚拟机和Java核心类所构成,它为纯Java程序提供了统一的编程接口,而不管下...

12720
来自专栏魂祭心

原 yield用法分析

37570
来自专栏积累沉淀

死锁

什么是死锁: 是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死...

21390
来自专栏码字搬砖

JVM内存模型之运行时常量池

运行时常量池 jdk7之前属于方法区的一部分,jdk8之后属于Metaspace,在heap中。 运行时常量池俗称常量池,主要用于存放编译期生成的各种字...

35910
来自专栏JetpropelledSnake

Python面试题之Python反射机制

 我们要导入另外一个模块,可以使用import.现在有这样的需求,我动态输入一个模块名,可以随时访问到导入模块中的方法或者变量,怎么做呢?

35120
来自专栏数值分析与有限元编程

Fortran知识|代码错误(input conversion error)

如图所示,提示:input conversion error ? 此时遇到了异常的转换错误。可能是输入数据类型与程序所声明变量类型不一致(比如输入2.5,对应变...

45060
来自专栏章鱼的慢慢技术路

Linux操作_grep/egrep工具的使用

17950

扫码关注云+社区

领取腾讯云代金券