您的位置:首页 > 编程语言 > Java开发

验证java中char数据类型在内存中的二进制形式为Unicode编码

2016-10-19 22:50 417 查看
前言:

        看见别的技术大牛都有写博客的习惯,我这个小牛也想跟跟风,虽然现在还不是大牛,不过我相信将来总有一天我也会是大牛,哈哈哈哈....现在就把以前初学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编码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息