A.概念
- **字节:**计算机内部用二进制字符串表示信息,每一个二进制位bit有两种状态,因此一个字节byte=8个二进制位,可以组合出2^8=256种状态。
- **ASCII码:**美国制定了一套规范英文字符和二进制位对应关系的规定——ASCII码,特点是第一位规定为0,只占用一个字节中的后7位,即一共规定了2^7128个字符的编码。
- **非ASCII码:**其他国家规定的,用来表达除英文字符外的国家语言符号,由于没有统一规范,所以不同国家的编码方式,128-255这一段表达的符号是不一样的。
- Unicode:——统一码,一种所有符号的编码:Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
- UTF-8: 互联网上使用最广的一种unicode实现方式。
UTF-8的编码规则
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
下表总结了编码规则,字母x表示可用编码的位。
Unicode符号范围 | UTF-8编码方式
UTF字节数 (十六进制) | (二进制)
——————–+———————————————
一个字节 0000 0000-0000 007F | 0xxxxxxx
两个字节 0000 0080-0000 07FF | 110xxxxx 10xxxxxx
三个字节 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
四个字节 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
eg: “严”,unicode是4E25(100111000100101),根据上表,发现4E25处在第三行的范围内,因此“严”的UTF-8编码需要三个字节,即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然后,从“严”的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,“严”的UTF-8编码是“11100100 10111000 10100101”,转换成十六进制就是E4B8A5。
Java中字符编码处理的标准函数:
*注:字符串在java内存中以unicode编码存储*
getBytes(charset):将字符串所表示的支付按照charset编码,并以字节数组方式表示。
new String(charset):将字节数组按照charest编码进行组合识别,最后转换为unicode存储。
setCharacterEncoding(charset):设置http请求或相应的编码(如果request不指定默认使用iso8859-1编码)
原文章链接:
https://blog.csdn.net/zougen/article/details/80272889