浅谈utf8和unicode及相关

浅谈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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值