浅谈utf8和unicode及相关
文章目录
一、简介
unicode、utf8等编码在开发中经常遇到,这里简单聊聊。
二、unicode
2.1 unicode定义
unicode是字符集,是一种二进制编码,为每种语言的每个字符设定统一且唯一的二进制编码,1994年正式公布。也就是指定了字符的二进制编码,但并没有指定该字符最终采用几个字节表示,unicode只是单纯的字符二进制编码。
2.2 unicode编码
unicode有ucs-2和ucs-4两种编码方式,即是:
- ucs-2(universal character set coded in 2 octets):表示用2个字节表示字符,为最全世界最常用的63K字符编码,如:\u6c49;
- ucs-4(universal character set coded in 4 octets):表示用4个字节表示字符;
三、utf编码
utf编码有utf-8、utf-16、utf-32三种形式,即:
- utf8是变长编码方式,用1到4个字节表示。
- utf16是变长编码方式,用2或4个字节表示。
- utf32是固定使用4个字节表示。
3.1 utf-8
3.1.1 utf-8规则
utf8是变长编码方式,用1到4个字节表示,各字节数表示如下:
0xxxxxxx
110xxxxxxx 10xxxxxx
1110xxxxxxx 10xxxxxx 10xxxxxx
11110xxxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
0开头的字节表示单独一个字符。除0开头的字节外, 其他3种,当第一个字节开头有几个1,就表示有多少个字节表示一个字符。
3.1.2 utf-8字节数
utf-8中,英文占1个字节,大多数汉字占3个字节,少数占4个字节
3.2 utf-16
utf-16是变长编码方式,用2或4个字节表示。对全世界常用的63k字符采用usc-2编码,另外用4个字节对不常用的字符编码。utf-16有三种方式: utf-16、utf-16be(big endian)、utf-16le(little endian)。这里涉及字节存储方式。
3.2.1 bom字节存储方式
字节存储方式,如ab cd,在不同存储方式如下:
big endian: 高位在前,即: ab cd
little endian: 低位在前,即: cd ab
uft-16在文件开头以bom(byte order mark)表明文件是big endian(开头是FE FF)还是little endian(开头是FF FE)。字节存储方式在表示unicode存储时也适用。
备注:windows默认是little endian。
3.2.2 utf-16与ucs-2
utf-16是usc-2的扩展,对全世界常用的63k字符采用usc-2编码,另外用4个字节对不常用的字符编码。
3.2.3 utf-16字节数
utf-16中,英文占2个字节,大多数汉字占2个字节,少数占4个字节
3.3 utf-32
utf-32是ucs-4的子集,固定使用4个字节表示。
四、java中编码
4.1 内码和外码
- 内码(internal encoding):特定语言中,string和char在内存中的编码方式
- 外码(external encoding):除内码外,其余都是外码
4.2 java中编码
- jvm内码采用UTF-16,char占2个字节, 早期2字节可以表示所有字符,后期新增unicode码后,有些字符采用2个char(即4个字节)表示。
- java的class文件采用utf-8存储,即字符占1到4个字节。java序列化采用utf-8编码。
4.3 java中输出指定编码
在java中,字符串转特定编码的byte[]数组后,可以借助BigInteger在转为特定进制(如2进制、16进制)的字符串形式。
import lombok.