非常一般的 JAVA 的学习笔记 —— 字符串编码小觑

想不到头一篇博文会在这种时候写出来,哼

也罢,不过是为了记录一下而已


废话不多说了,这个是个纠结了很长时间的事情——java中的字符串到底是以什么方式存储,再转换为其他编码的时候又会以什么方式输出——原本已经想得很清楚,但只要过一段时间不接触就会忘,索性写这么个东西来记录一下

总所周知,java中的基本类型 char 是以 UTF-16 编码存储的,可后来知道了 UTF-16 还分大端 和 小端 就纠结了,java 里面的到底是大端还是小端,写个程序试试呗

于是便有了下面这个比较简陋的测试 main 函数,顺便也把别的常用编码看了看

public static void main(String[] args) {
		int i, length;
		int iChar;
		String strTest;
		char[] arrChTest;
		byte[] bytesTestGBK;
		byte[] bytesTestUTF8;
		byte[] bytesTestUTF16LE;
		byte[] bytesTestUTF16BE;
		
		strTest = "想回到大学时代。。。";
		
		arrChTest = strTest.toCharArray();
		try {
			bytesTestGBK = strTest.getBytes("GBK");
			bytesTestUTF8 = strTest.getBytes("UTF8");
			bytesTestUTF16LE = strTest.getBytes("UTF-16LE");
			bytesTestUTF16BE = strTest.getBytes("UTF-16BE");
			
			System.out.println("char 类型的:" + arrChTest.length);
			for ( i = 0; i < arrChTest.length; ++i ) {
				iChar = arrChTest[i];
				System.out.printf("%04X ", iChar);
			}
			System.out.println();
			
			System.out.println("字节序列数组 GBK:" + bytesTestGBK.length);
			for ( i = 0; i < bytesTestGBK.length; ++i ) {
				System.out.printf("%02X ", bytesTestGBK[i]);
			}
			System.out.println();
			
			System.out.println("字节序列数组 UTF-8:" + bytesTestUTF8.length);
			for ( i = 0; i < bytesTestUTF8.length; ++i ) {
				System.out.printf("%02X ", bytesTestUTF8[i]);
			}
			System.out.println();
			
			System.out.println("字节序列数组 UTF16LE:" + bytesTestUTF16LE.length);
			for ( i = 0; i < bytesTestUTF16LE.length; ++i ) {
				System.out.printf("%02X ", bytesTestUTF16LE[i]);
			}
			System.out.println();
			
			System.out.println("字节序列数组 UTF16BE:" + bytesTestUTF16BE.length);
			for ( i = 0; i < bytesTestUTF16BE.length; ++i ) {
				System.out.printf("%02X ", bytesTestUTF16BE[i]);
			}
			System.out.println();
		}
		catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}


结果:

char 类型的:10
60F3 56DE 5230 5927 5B66 65F6 4EE3 3002 3002 3002 
字节序列数组 GBK:20
CF EB BB D8 B5 BD B4 F3 D1 A7 CA B1 B4 FA A1 A3 A1 A3 A1 A3 
字节序列数组 UTF-8:30
E6 83 B3 E5 9B 9E E5 88 B0 E5 A4 A7 E5 AD A6 E6 97 B6 E4 BB A3 E3 80 82 E3 80 82 E3 80 82 
字节序列数组 UTF16LE:20
F3 60 DE 56 30 52 27 59 66 5B F6 65 E3 4E 02 30 02 30 02 30 
字节序列数组 UTF16BE:20
60 F3 56 DE 52 30 59 27 5B 66 65 F6 4E E3 30 02 30 02 30 02 

char 可以简单的认为成是 short 类型的

拿第一个字符来说: char = 60F3 , 对应 UTF16LE 的字节 = F3 60,对应 UTF16BE 的字节 = 60 F3,字节按照由低到高输出,乍一看 UTF16BE 编码和 java 的 char 类型是一致的,但是实际上,char 作为数字来说 60 是高位,F3是低位,所以由低到高 F3 60 才是正序,也就是说 char 是 UTF16LE 编码,而非 UTF16BE 

有点绕,尤其对于强迫症来说是个灾难,明明“60F3” 与 “60 F3 ” ,不知道别人怎么看,反正一开始我是觉得挺别扭,这东西别太纠结,明白了就好


唉?这么一说好像很简单,那么我之前到底在纠结什么呢?算了,就留给自己看吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值