验证java中char数据类型在内存中的二进制形式为Unicode编码
2016-10-19 22:50
417 查看
前言:
看见别的技术大牛都有写博客的习惯,我这个小牛也想跟跟风,虽然现在还不是大牛,不过我相信将来总有一天我也会是大牛,哈哈哈哈....现在就把以前初学java的一些小笔记拿出来练练手,比较适合新手学习,文中难免出错,欢迎各位积极提出探讨. -------以此纪念我的第一篇博客
1.为方便查看,首先将char在内存中的二进制形式输出到控制台,代码如下:
输出结果为:
我(int:25105)--->
0110 0010 0001 0001
们(int:20204)---> 0100 1110 1110 1100
2.分别以"gbk","utf-8","utf-16"字符集编码输出到控制台,代码如下:
输出结果如下:
我们知道,utf-8/utf-16都是Unicode的实现方式之一,其中utf-8的存储格式如下图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201610/2dd01aa32123852634e71dc1bb357ea4)
以代码中的"我",为例,根据utf-8的规则可以提取出"我"字的Unicode的为:0110 0010 0001 0001;我们发现,这与第一段代码中的结果一直,经过多个字符的测试,都能得出同样的结论.
由此我们可以得出结论:java中char数据类型在内存中的二进制形式为Unicode编码
看见别的技术大牛都有写博客的习惯,我这个小牛也想跟跟风,虽然现在还不是大牛,不过我相信将来总有一天我也会是大牛,哈哈哈哈....现在就把以前初学java的一些小笔记拿出来练练手,比较适合新手学习,文中难免出错,欢迎各位积极提出探讨. -------以此纪念我的第一篇博客
1.为方便查看,首先将char在内存中的二进制形式输出到控制台,代码如下:
public static void main(String[] args) throws Exception { String str = "我们"; Memory2Binary(str); } //输出char/String类型的数据在内存中的二进制形式 private static void Memory2Binary(String str) { //将字符串转换为char数组 char[] cs = str.toCharArray(); //遍历char素组中的每个元素 for (char c : cs) { int n = c; String sb = Integer.toBinaryString(n); //不够16位的二进制前面补零 if (sb.length() < 16) { int a = 16 - sb.length(); for (int i = 0; i < a; i++) { sb = "0" + sb; } } System.out.print(c + "(int:" + n + ")---> "); //4位4位二进制间加入一个空格 for (int i = 0; i < 16; i += 4) { System.out.print(sb.substring(i, i + 4) + " "); } System.out.println(); } }
输出结果为:
我(int:25105)--->
0110 0010 0001 0001
们(int:20204)---> 0100 1110 1110 1100
2.分别以"gbk","utf-8","utf-16"字符集编码输出到控制台,代码如下:
public static void main(String[] args) throws Exception { String str = "我们"; testEncoding(str, "gbk"); testEncoding(str, "utf-8"); testEncoding(str, "utf-16");//charsetName输入"unicode",输出结果与"utf-16"一致 } private static void testEncoding(String str, String charsetName) throws Exception { System.out.println("======= " + charsetName + " ========"); // System.out.println("字符: " + str); byte[] bs = str.getBytes(charsetName); System.out.println(" 二进制 16进制"); System.out.println("----------------------"); //遍历byte[],以二进制和16进制形式打印 for (byte b : bs) { //2进制转换 String sb = Integer.toBinaryString(b); int length; //二进制位数不够八位,前面补零,否则打印后八位 if (sb.length() < 8) { int a = 8 - sb.length(); for (int i = 0; i < a; i++) { sb = "0" + sb; } } else { length = sb.length(); sb = sb.substring(length - 8, length); } //2进制四位四位之间插入制表符 for (int i = 0; i < 8; i += 4) { System.out.print(sb.substring(i, i + 4) + "\t"); } //16进制转换 sb = Integer.toHexString(b); length = sb.length(); if (length > 1) { System.out.println("0x" + sb.substring(length - 2, length).toUpperCase()); } else { System.out.println("0x0" + sb.substring(0, 1).toUpperCase()); } } }
输出结果如下:
======= gbk ======== 字符: 我们 二进制 16进制 ---------------------- 1100 1110 0xCE 1101 0010 0xD2 1100 0011 0xC3 1100 0111 0xC7 ======= utf-8 ======== 字符: 我们 二进制 16进制 ---------------------- 1110 0110 0xE6 1000 1000 0x88 1001 0001 0x91 1110 0100 0xE4 1011 1011 0xBB 1010 1100 0xAC ======= utf-16 ======== 字符: 我们 二进制 16进制 ---------------------- 1111 1110 0xFE 1111 1111 0xFF 0110 0010 0x62 0001 0001 0x11 0100 1110 0x4E 1110 1100 0xEC ----------------------
我们知道,utf-8/utf-16都是Unicode的实现方式之一,其中utf-8的存储格式如下图:
以代码中的"我",为例,根据utf-8的规则可以提取出"我"字的Unicode的为:0110 0010 0001 0001;我们发现,这与第一段代码中的结果一直,经过多个字符的测试,都能得出同样的结论.
由此我们可以得出结论:java中char数据类型在内存中的二进制形式为Unicode编码
相关文章推荐
- java基础----char等数据类型
- java中数据类型转换 Integer String Long Float Double Date Char
- Java JDBC读取二进制类型数据(BLOB)
- java中的各种数据类型在内存中存储的方式 二
- Java数据类型之byte、char
- 关于数据类型Char(看了论坛的帖子后自己写的)——原来一个中文字在java中也是一个char
- java中的各种数据类型在内存中存储的方式
- C的无符号数据类型int,short,byte 转为 Java对应的数据long,char,short
- java中的各种数据类型在内存中存储的方式---作者:KingBoxing(转)
- 数据在内存中始终是以二进制形式存放的,数值是以补码表示的
- ZZ:java中数据类型转换 (int string char等)
- Java基本数据类型的内存分配
- java中的各种数据类型在内存中存储的方式
- C的无符号数据类型int,short,byte 转为 Java对应的数据long,char,short
- 类型强制转换,数据内存存储形式
- 获得一个数据在内存中存储的二进制形式
- java中byte char short类型数据的操作说明
- 非printf形式打印各种数据类型的十六进制和二进制
- Java数据类型之byte、char
- java中的各种数据类型在内存中存储的方式