验证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编码


  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值