您的位置:首页 > 其它

编码总结

2016-05-22 20:09 218 查看
摘要:

本文旨在以吃快餐的方式帮助您理解编码问题,如果想要深入的理解,请仔细阅读本文中所给出的链接。

字符集和编码

众所周知,机器所能理解的语言只有0和1,而人类的语言却有着众多的符号。如何将这些符号转换为机器所能理解的语言呢,答案就是对这些字符进行编码。

字符集和编码是两个不同的概念,这里是理解编码的重点,一定不要混淆。

字符集

所谓的字符集其实就是字符的集合。字符集的发展一共经历了三个阶段,第一是ASCII,学过计算机的应该都不陌生。这个阶段计算机还只有在美国使用,所以产生了ascii码,一个字节来表示所有字符已经足够美国人用了。但是随着计算机的发展,其他国家也想使用计算机。这时,编码就进入了ANSI本地化阶段。这个时期的编码都是各个国家区域自己定义的,一个编码在这个区域中是一个含义,但是到了另一个区域就代表另一个字符。为了使得编码能够统一,编码的发展进入了第三个阶段,统一编码阶段。这个时候由国际统一标准协会制定的字符集,无论拿到哪里都是代表的同一个含义。

常见的字符集有unicode,GB2312(中国的),GBK等。

简而言之,使用哪些字符。也就是说哪些汉字,字母和符号会被收入标准中。所包含“字符”的集合就叫做“字符集”。

编码

一般来说, 每一个字符集都对应着一种编码。这个编码就是该字符集在内存或文件中的存放编码。

对于unicode来说,它的编码方式有很多种(UTF-8,UTF-16等)。产生的原因是统一采用双字节编码的时候对英文字符传输会造成浪费,所以就有了utf-8。

简而言之,规定每个“字符”分别用一个字节还是多个字节存储,用哪些字节来存储,这个规定就叫做“编码”。

关于编码的详细解释请参照这篇博客(强烈推荐)

编程时候的编码

无论是c,c++还是java,我们编写文件的时候都需要有一个文件的编码,这个编码是对编译器来说的。

也就是说你需要告诉一个编译器我的文件时什么编码,这个时候它才会将你源码中的字符正确的识别。

然后重点来了,识别之后呢?我们的字符时如何存在内存中的?

有些人认为源码的文件编码就是字符实际在内存中的编码,其实这是错误的。举个最简单的例子,java程序的所有编码都是unicode,但是你的源文件编码可以有很多种。由此我们可以知道字符在内存中的编码很可能与源文件的编码是不同的。你可以采用字节数组的方式产看文字在内存中的实际编码。(这里的文字指的都是str=“中文”这种变量)

对于java 来说,编码转化是很容易的,new String(byte[],charset)就能将字节数组以指定的编码方式去编码。而对于c++来说却没有这么方便的工具,只能依赖第三方库或者自己写转换代码了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编码