亲宝软件园·资讯

展开

一文说清文本编码那些事

fasionchan 人气:0
一直以来,编码问题像幽灵一般,不少开发人员都受过它的困扰。 试想你请求一个数据,却得到一堆乱码,丈二和尚摸不着头脑。有同事质疑你的数据是乱码,虽然你很确定传了 *UTF-8* ,却也无法自证清白,更别说帮同事 *debug* 了。 有时,靠着百度和一手瞎调的手艺,乱码也能解决。尽管如此,还是很羡慕那些骨灰级程序员。为什么他们每次都能犀利地指出问题,并快速修复呢?原因在于,他们早就把编码问题背后的各种来龙去脉搞清楚了。 本文从 [ASCII](https://en.wikipedia.org/wiki/ASCII) 码说起,带你扒一扒编码背后那些事。相信搞清编码的原理后,你将不再畏惧任何编码问题。 ## 从 ASCII 码说起 现代计算机技术从英文国家兴起,最先遇到的也是英文文本。英文文本一般由 *26* 个字母、 *10* 个数字以及若干符号组成,总数也不过 *100* 左右。 计算机中最基本的存储单位为 **字节** ( *byte* ),由 *8* 个比特位( *bit* )组成,也叫做 **八位字节** ( *octet* )。*8* 个比特位可以表示 $ 2^8 = 256 $ 个字符,看上去用字节来存储英文字符即可? 计算机先驱们也是这么想的。他们为每个英文字符编号,再加上一些控制符,形成了我们所熟知的 [ASCII](https://en.wikipedia.org/wiki/ASCII) 码表。实际上,由于英文字符不多,他们只用了字节的后 *7* 位而已。 ![](http://python.fasionchan.com/zh_CN/latest/_images/fd3a4b1205b5bb1511ae43303a7275a3.png) 根据 *ASCII* 码表,由 *01000001* 这 *8* 个比特位组成的八位字节,代表字母 *A* 。 ![](http://python.fasionchan.com/zh_CN/latest/_images/7f524be0e18ac44cc71276393e60718a.svg) 顺便提一下,比特本身没有意义,**比特** 在 **上下文** ( *context* )中才构成信息。举个例子,对于内存中一个字节 *01000001* ,你将它看做一个整数,它就是 *65* ;将它作为一个英文字符,它就是字母 *A* ;你看待比特的方式,就是所谓的上下文。 所以,猜猜下面这个程序输出啥? ```c #include

加载全部内容

相关教程
猜你喜欢
用户评论