写代码的时候,很早就接触到了字符编码的问题,一度非常害怕这个知识点,只祈祷不要出现乱码,不敢直面问题。后来发现这样不行啊,这个字符编码问题太常见了,根本没法避开,刚开始工作几年,不懂,还可以找找借口,工作时间久了以后,还是不能说出个所以然来,脸上也挂不住。于是,在网上也查了不少资料,由于没抓住核心问题,感觉资料看得越多越糊涂。直到最近,又看到了一本书上的介绍,把自己理解的一点心得记下来。
首先,ASCII编码是我们最开始接触的,但是这个玩意只能满足部分少数国家的语言需求。于是各个国家后面规定了自己的编码,比如中文的GBK,但是呢这玩意通用性不强啊,在中国是GBK,其他国家不认识啊,解析就乱码了。大伙一商量,不如我们搞个统一编码,全世界都一样,这样就不乱码了,于是Unicode就出来了。这个Unicode呢,我理解的是它只规定了码点,它的范围是0x10FFFF,有1114112个码位,比如0x103456代表什么意思。那这个码点具体怎么编码呢,这个就衍生出了几种方案。
最直接的一种,就是用UTF32来存,4个字节,那就又LE和BE之分呢,同样的,还有UTF16,2个字节为一个码元,也存在LE和BE之分。还有就是我们今天要讲的UTF8,一个字节为一个码元,这里的核心就是要抓住问题的核心----码元,我之前一直没搞明白,比如汉字,一般用UTF8来表示的话,就是3个字节,那同样应该存在123和321这两种顺序啊,咋网上都说UTF8不存在字节序的问题呢,别人讲的理由我反复看了,还是没法理解。
直到现在,我理解了码元,这个基本单元之后,就明白了,码元要看作一个整体,如果码元大于1个字节,当然就存在字节序问题,如果码元为1个字节,就不存在字节序问题。因为UTF8中,汉字的码元顺序是严格按照要求规定的,不能顺便颠倒。举个例子来说,“汉”字的统一码编码是0x6C49。0x6C49在0x0800-0xFFFF之间,使用用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将0x6C49写成二进制是:0110 1100 0100 1001,用这个比特流依次代替模板中的x,得到:1110 0110 1011 0001 1000 1001,即E6 B1 89。
你如果写 89 B1 E6这个就不是个汉字了,必须严格按照码位来生成,所以要UTF8就不存在字节序的问题。
不知道我有没有把这个问题讲解清楚,但是我觉得我目前应该是掌握了这个知识点,以后不再怵字节编码的问题了。
为什么UTF8不存在字节序问题
最新推荐文章于 2024-09-02 19:53:02 发布