编码总结
2016-05-22 20:09
218 查看
摘要:
本文旨在以吃快餐的方式帮助您理解编码问题,如果想要深入的理解,请仔细阅读本文中所给出的链接。
字符集和编码是两个不同的概念,这里是理解编码的重点,一定不要混淆。
字符集
所谓的字符集其实就是字符的集合。字符集的发展一共经历了三个阶段,第一是ASCII,学过计算机的应该都不陌生。这个阶段计算机还只有在美国使用,所以产生了ascii码,一个字节来表示所有字符已经足够美国人用了。但是随着计算机的发展,其他国家也想使用计算机。这时,编码就进入了ANSI本地化阶段。这个时期的编码都是各个国家区域自己定义的,一个编码在这个区域中是一个含义,但是到了另一个区域就代表另一个字符。为了使得编码能够统一,编码的发展进入了第三个阶段,统一编码阶段。这个时候由国际统一标准协会制定的字符集,无论拿到哪里都是代表的同一个含义。
常见的字符集有unicode,GB2312(中国的),GBK等。
简而言之,使用哪些字符。也就是说哪些汉字,字母和符号会被收入标准中。所包含“字符”的集合就叫做“字符集”。
编码
一般来说, 每一个字符集都对应着一种编码。这个编码就是该字符集在内存或文件中的存放编码。
对于unicode来说,它的编码方式有很多种(UTF-8,UTF-16等)。产生的原因是统一采用双字节编码的时候对英文字符传输会造成浪费,所以就有了utf-8。
简而言之,规定每个“字符”分别用一个字节还是多个字节存储,用哪些字节来存储,这个规定就叫做“编码”。
关于编码的详细解释请参照这篇博客(强烈推荐)
也就是说你需要告诉一个编译器我的文件时什么编码,这个时候它才会将你源码中的字符正确的识别。
然后重点来了,识别之后呢?我们的字符时如何存在内存中的?
有些人认为源码的文件编码就是字符实际在内存中的编码,其实这是错误的。举个最简单的例子,java程序的所有编码都是unicode,但是你的源文件编码可以有很多种。由此我们可以知道字符在内存中的编码很可能与源文件的编码是不同的。你可以采用字节数组的方式产看文字在内存中的实际编码。(这里的文字指的都是str=“中文”这种变量)
对于java 来说,编码转化是很容易的,new String(byte[],charset)就能将字节数组以指定的编码方式去编码。而对于c++来说却没有这么方便的工具,只能依赖第三方库或者自己写转换代码了。
本文旨在以吃快餐的方式帮助您理解编码问题,如果想要深入的理解,请仔细阅读本文中所给出的链接。
字符集和编码
众所周知,机器所能理解的语言只有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++来说却没有这么方便的工具,只能依赖第三方库或者自己写转换代码了。
相关文章推荐
- ASP编码必备的8条原则
- XML指南——XML编码
- C#中字符串编码处理
- ExtJS中文乱码之GBK格式编码解决方案及代码
- 程序员趣味读物 谈谈Unicode编码
- 文本文件编码方式区别
- C语言安全编码之数值中的sizeof操作符
- C#实现获取文本文件的编码的一个类(区分GB2312和UTF8)
- VC中BASE64编码和解码使用详解
- 计算机中的字符串编码、乱码、BOM等问题详解
- Base64编码解码原理及C#编程实例
- C#编码好习惯小结
- javascript编码的几个方法详细介绍
- UTF8编码开发中页面空白问题的解决方法
- php生成固定长度纯数字编码的方法
- 重新restore了mysql到另一台机器上后mysql 编码问题报错
- c# Base64编码和图片的互相转换代码
- java自动根据文件内容的编码来读取避免乱码
- PHP写入WRITE编码为UTF8的文件的实现代码
- 设置php页面编码的两种方法示例介绍