赞
踩
注:文中可能有错误,欢迎指出来,谢谢
举例说明
emoji表情
1:比如你的wifi热点名称是一个章鱼符号 u+1F419
2:转化成UTF-8为: F0 9F 90 99
3: 发现在Java的JVM中是用UTF-16存储表示的,也就是u+1F419转化为UTF-16(四个字节表示)为: D8 3D CC 19
此时大象的表情由下层已经传到上层JVM中了,并且保存了,关键在于又要传下去,此时把大象的表情传下去又要转化成 UTF-8,而这个时候大象的表情的Unicode编码为D8 3D CC 19(JVM刚才存储保存的 关于JVM这个,可能说错),传下去意思就是转换成UTF-8,根据相关映射关系,结果为: ED A0 BD ED B0 99
(PS:我就说在项目开发中,为什么手机热点为大象时,相关代码打印出来的16进制表示为 xEDxA0xBDxEdxB0x99 查了一下该表情编码为 U+1F419 )
内容一:
步骤1转化成步骤2过程:
1F419 二进制为:1 1111 0100 0001 1001通过下图的映射关系
因为 1F419 处于 0001 0000-0010 FFFF这个范围 (第四行)所以将 1 1111 0100 0001 1001补进x号中,注意是从右往左补,结果为:
11110xxx 10x11111 10010000 10011001 然后是x用0来补,最终结果为 11110000 10011111 10010000 10011001 ,对应的表示结果(16进制)为 F0 9F 90 99 正式的表示方法为 \xF0\x9F\x90\x99\
内容二:
步骤1转化成步骤3:
Unicode使用UTF-16编码原理:
图片里面的U 指的就是 1F419,因为1F419 >0x10000, 我们先计算 U’= U-10000(此为16进制表示格式哦,换成二进制为 0001 0000 0000 0000 ),U' = 1F419-10000=F419 ,然后将U'写成二进制形式(从右往左写,左边空着的补0) :0000(yyyy) 1111(yyyy) 0100(yyxx) 0001(xxxx) 1001(xxxx)。所以 U 的UTF-16编码(二进制)就是:
1101100000111101 1101110000011001(用16进制表示为: D83D CC19,注:用四个字节表示的,前面两个一块,后面两个一块的 (这是我有疑惑的地方))此时在上层就是这样保存该表情的,
然后又要下发给底层,相当于是 大象的表情此时的Unicode二进制编码为 1101100000111101 1101110000011001,使用Unicode转化成UTF-8的映射图表如下图(和上面一样一样滴)
属于00000800 - 0000FFFF(第三行)范围(用16进制表示为: D83D CC19,注:用四个字节表示的,前面两个一块,后面两个一块的(这是本片文章我有疑惑的地方))D83D转化成UTF-8字节流(二进制)结果为: 11101101 10100000 10111101 ;CC19转化成UTF-8字节流(二进制)结果为:11101101 10110000 10011001,合起来结果就是11101101 10100000 10111101 11101101 10110000 10011001,对应的16进制为:ED A0 BD ED B0 99 ,正式的写法为:\xED\xA0\xBD\xED\xB0\x99\.终于我知道了相关日志打印出来的wifi名称是大象的表情的编码为 \xED\xA0\xBD\xED\xB0\x99\
感谢这位博主的文章,谢啦。http://blog.csdn.net/u200814499/article/details/53420263
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。