免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: orclover
打印 上一主题 下一主题

为什么utf-8没有字节序问题? [复制链接]

论坛徽章:
6
2015年辞旧岁徽章
日期:2015-03-05 16:13:092015年迎新春徽章
日期:2015-03-05 16:13:092015小元宵徽章
日期:2015-03-06 15:58:1815-16赛季CBA联赛之浙江
日期:2016-11-05 14:38:4115-16赛季CBA联赛之新疆
日期:2016-11-11 18:38:06
21 [报告]
发表于 2015-10-17 07:59 |只看该作者
在utf8与unicode的转换时,还是有类似字节序的问题的。之所以说是类似,是因为unicode码并不是按字节拆分到utf8编码中的。

如一个实16位中文字符,分成4位,6位,6位拆到3个字节中,如何安排这4位,6位,6位数据,就是类似字节序的问题。

实际规定从高位开始取,即顺序先取高4位,再取中6位,最后低6位(类似大端处理)。

取完再加上前缀凑足字节长度,就可号称无字节序问题了。

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
22 [报告]
发表于 2015-10-17 13:55 |只看该作者
电脑中存储的基本单元就是字节,所以UTF-8、GBK这些“字节编码”没有字节序问题。
UTF-16的编码单元是word,也就是双字节,编码单元之间没的顺序是确定的,但编码单元内部就会有那个字节放前面的的问题,这就是所谓的字节序问题。

补充一句,UTF-8没有字节序“问题”,但UTF-8里真的有字节序“相关的概念”。
UTF-8字节流的最开始可以加入三个字节\xEF\xBB\xBF的BOM,也就是byte-order-mark,你们都看见byte order这两个单词了……

论坛徽章:
6
2015年辞旧岁徽章
日期:2015-03-05 16:13:092015年迎新春徽章
日期:2015-03-05 16:13:092015小元宵徽章
日期:2015-03-06 15:58:1815-16赛季CBA联赛之浙江
日期:2016-11-05 14:38:4115-16赛季CBA联赛之新疆
日期:2016-11-11 18:38:06
23 [报告]
发表于 2015-10-17 19:14 |只看该作者
utf8存储时没字节序问题,但转换时就有了。只不过它固定使用了大端处理方式,实际上也可小端处理,一样编成字节码。只要编码与解码保持一致即可。

论坛徽章:
6
2015年辞旧岁徽章
日期:2015-03-05 16:13:092015年迎新春徽章
日期:2015-03-05 16:13:092015小元宵徽章
日期:2015-03-06 15:58:1815-16赛季CBA联赛之浙江
日期:2016-11-05 14:38:4115-16赛季CBA联赛之新疆
日期:2016-11-11 18:38:06
24 [报告]
发表于 2015-10-17 19:18 |只看该作者
也就是utf8把如何解释字节序推到了编解码阶段。。。

论坛徽章:
6
2015年辞旧岁徽章
日期:2015-03-05 16:13:092015年迎新春徽章
日期:2015-03-05 16:13:092015小元宵徽章
日期:2015-03-06 15:58:1815-16赛季CBA联赛之浙江
日期:2016-11-05 14:38:4115-16赛季CBA联赛之新疆
日期:2016-11-11 18:38:06
25 [报告]
发表于 2015-10-17 19:50 |只看该作者
orclover 发表于 2010-03-23 17:38
在网上还看到一种说法“在 UTF-8 中总是可以知道所处的位置,就是说给定一个字节,马上就能确定它是一个单字节字符、双字节字符的第一个字节、双字节字符的第二个字节,或者三字节/四字节字符的第二个、第三个或第四个字节”,这个是如何做到的?

比如三字节编码一般格式如下:
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx

第二个和第三个字节的格式一样,任意取出一个,怎么知道哪个是第二个,哪个是第三个?


只有看第1个字节才能判断长度,后面的跟随字节是看不出来的(前缀都是10)。

单字节编码前缀: 0
两字节编码前缀: 110
三字节编码前缀: 1110
四字节编码前缀: 11110
五字节编码前缀: 111110
六字节编码前缀: 1111110
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP