Unicode码的二进制转换(Java)

湘西刺客王胡子 2021-02-23 16:47:44
转换 二进制 二进 进制 unicode


内容为个人学习心得,不能对准确性做过多保证,错误之处还望指点。

有时候我们会遇到一些\u开头的字符串,我们知道这些是Unicode码,一组\uxxxx字符串对应了一个Unicode字符。那这些编码字符的实际二进制存储格式是怎样呢?
我们知道Unicode编码可以呈现世界上大部分的文字内容,而在其最通用的一种编码方式UTF-8
)下,单字符的存储长度为1-4字节(可变),这种设计的由来和优点就不多讲了,这里主要说说看到的\u编码串和二进制的换算方式。
在UTF-8编码格式的java代码下,对“测试”两个字打印其字节和字符结果如下:

System.out.println(Charset.defaultCharset());
String s = "测试";
System.out.println(s.chars().mapToObj(Integer::toHexString).collect(Collectors.joining("\t")));
byte[] bs = s.getBytes();
System.out.println(Arrays.toString(bs));
/*Result:
UTF-8
6d4b 8bd5
[-26, -75, -117, -24, -81, -107] */

观察结果可知,“测试”两个字在UTF-8编码下占六个字节,将 【-26, -75, -117, -24, -81, -107】 6个数字转为二进制补码格式,即得到“测试”两字的二进制存储内容,为:
11100110 10110101 10001011 11101000 10101111 10010101
而通过char.ToHexString得到的 6d4b 8bd5 是这两个字的Unicode编码
这两者是怎么关联上的呢?
通过UTF-8的百科页面有如下介绍:

UTF-8编码字节含义
  • 对于UTF-8编码中的任意字节B,如果B的第一位为0,则B独立的表示一个字符(ASCII码);
  • 如果B的第一位为1,第二位为0,则B为一个多字节字符中的一个字节(非ASCII字符);
  • 如果B的前两位为1,第三位为0,则B为两个字节表示的字符中的第一个字节;
  • 如果B的前三位为1,第四位为0,则B为三个字节表示的字符中的第一个字节;
  • 如果B的前四位为1,第五位为0,则B为四个字节表示的字符中的第一个字节;

因此,对于上面得到的二进制串,每8位中的前面部分都是用来做标记的,1110开头表明需要3个字节来描述当前字符,并且当前字节为3字节中的第一部分,后面的字节使用10开头表明自己是当前字符编码串的后面部分。
把前三字节这些标记为去掉再合并,得到 0110 110101 001011,而“”字的16进制Unicode编码转为二进制,正是0110 1101 0100 1011。
这样做的优点很明显,扩展方便(看起来能支持到8字节编码呢),编码结构去掉了二进制的标记位,减小体积更易于数据传输。1字节的UTF-8码还完整兼容了ASCII码,所以UTF-8可以说应该是大部分场景下的最优选择了。

版权声明
本文为[湘西刺客王胡子]所创,转载请带上原文链接,感谢
https://segmentfault.com/a/1190000039263413

  1. J2EE
  2. Vue uses SDK to upload seven cows
  3. k8s-dns
  4. JavaScript mailbox verification - regular verification
  5. k8s-dashboard
  6. How many questions can you answer?
  7. Spring annotation -- transactional
  8. [k8s cluster] construction steps
  9. k8s-kubeadm
  10. k8s-etcd
  11. Using HashMap to improve search performance in Java
  12. There is no class problem when Maven publishes jar package
  13. JavaScriptBOM操作
  14. J2EE
  15. k8s-prometheus-memory
  16. k8s-prometheus disk
  17. k8s-prometheus
  18. JavaScript BOM operation
  19. k8s-prometheus-memory
  20. k8s-prometheus disk
  21. k8s-prometheus
  22. Linux Disk Command
  23. Linux FS
  24. 使用docker-compose &WordPress建站
  25. Linux Command
  26. This time, thoroughly grasp the depth of JavaScript copy
  27. Linux Disk Command
  28. Linux FS
  29. Using docker compose & WordPress to build a website
  30. Linux Command
  31. 摊牌了,我 HTTP 功底贼好!
  32. shiro 报 Submitted credentials for token
  33. It's a showdown. I'm good at it!
  34. Shiro submitted credentials for token
  35. Linux Stress test
  36. Linux Root Disk Extension
  37. Linux Stress test
  38. Linux Root Disk Extension
  39. Redis高级客户端Lettuce详解
  40. springboot学习-综合运用(一)
  41. 忘记云服务器上MySQL数据库的root密码时如何重置密码?
  42. Detailed explanation of lettuce, an advanced client of redis
  43. Springboot learning integrated application (1)
  44. Linux File Recover
  45. Linux-Security
  46. How to reset the password when you forget the root password of MySQL database on the cloud server?
  47. Linux File Recover
  48. Linux-Security
  49. LiteOS:盘点那些重要的数据结构
  50. Linux Memory
  51. Liteos: inventory those important data structures
  52. Linux Memory
  53. 手把手教你使用IDEA2020创建SpringBoot项目
  54. Hand in hand to teach you how to create a springboot project with idea2020
  55. spring boot 整合swagger2生成API文档
  56. Spring boot integrates swagger2 to generate API documents
  57. linux操作系统重启后 解决nginx的pid消失问题
  58. Solve the problem of nginx PID disappearing after Linux operating system restart
  59. JAVA版本号含义
  60. The meaning of java version number