## UTF-8是如何编码的？ 原

topwqp

``````String a = “A”

a.getBytes().length is 1

byte array is [65]

String a = "ë"

a.getBytes().length is 2

byte array is [-61, -85]
``````

etBytes()假设默认编码方式为UTF-8。

UTF-8如何进行编码？Wikipedia中给出了相关的规则：

if the first byte starts with 0 then it is a single byte char

if the first byte starts with 110 then it is 2 bytes

if the first byte starts with 1110 then it is 3 bytes

if the first byte starts with 11110 then it is 4 bytes

if the first byte starts with 111110 then it is 5 byte

if the first byte starts with 1111110 then it is 6 byte

if the first byte starts with 110 then it is 2 byte so it decodes 2 consecutive bytes

if the first byte starts with 1110 then it is 3 byte so it decodes 3 consecutive bytes

if the first byte starts with 11110 then it is 4 byte so it decodes 4 consecutive bytes

if the first byte starts with 111110 then it is 5 byte so it decodes 5 consecutive bytes

if the first byte starts with 1111110 then it is 6 byte so it decodes 6 consecutive bytes

ë

110 xxxxx 10 xxxxxx

110 00011 10 101011

``````  00011       101011  → binary equivalent of hex pointing to ë
``````

ɟ 110 xxxxx 10 xxxxxx

110 01001 10 011111

``````  01001     011111   → binary equivalent of hex pointing to ɟ
``````

11100000 10101101 10011111如何解码？ 1110代表是三个字节为一个字符： 1110xxxx 10xxxxxx 10xxxxxx

11100000 10101101 10011111

so 0000 101101 011111 is the binary to be decoded.

The binary is B5F in hexadecimal (If you don't know to convert use this binary to hex converter website ) Now from map B5F means ୟ .

1、第一个字符 01000010 为一个字符： 0100 0010为：42 参考这里 对应字符B

2、第二个字符

01000001 为一个字符： 0100 0001为：41 参考表格 对应字符A

3、第三个字符 11000011 10110000 为一个字符： 0000 11 110000 就是F0， 参考表格 映射为字符：ð

4、第四个字符： 11100010 10001011 10110011 为一个字符： 00010 001011 110011 就是 22F3 参考表格映射为字符：⋳

String 的 getBytes("UTF-8")做了什么操作呢？

``````String s = "ABCDEF⋳";
``````

ABCDEF⋳通过getBytes("UTF-8")被编码为UTF-8格式，它是如何存储的呢？ A - 01000001

B - 01000010

C - 01000011

D - 01000100

E - 01000101

F - 01000110

⋳ - 11100010 10001011 10110011

01000001 代表正数 65 但是11100010 代表负数 -31

01000010 - 66

01000011 - 67

01000100 - 68

01000101 - 69

01000110 - 70

11100010 - -31

10001011 - -117

10110011 - -77

``````	         String s = "ABCDEF⋳";
byte[]  bs = s.getBytes("UTF-8");
for(byte  b : bs)
System.out.print(b+",");
``````

``````65,66,67,68,69,70,-30,-117,-77
``````

### topwqp

Java 正确的做字符串编码转换

2013/11/19
14.2K
0
UTF-8编码中BOM的检测与删除

2012/10/12
680
0
UTF-8编码中BOM的检测与删除

workingTiams
2012/11/28
420
1

2016/04/14
398
2

Unicode Unicode 是一种编码，它将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码。这样乱码问题就会消失。这就是 Unicode，就像它的名字都表示的，这是一种所有符号的编码...

cooffeelis
2017/11/18
0
0

popgis
19分钟前
4
0

code-ortaerc
34分钟前
4
0

52分钟前
40
0
Mybatis Plus service

/** * @author beth * @data 2019-10-20 23:34 */@RunWith(SpringRunner.class)@SpringBootTestpublic class ServiceTest { @Autowired private IUserInfoService iUserInfoS......

5
0
php7-internal 7 zval的操作

## 7.7 zval的操作 扩展中经常会用到各种类型的zval，PHP提供了很多宏用于不同类型zval的操作，尽管我们也可以自己操作zval，但这并不是一个好习惯，因为zval有很多其它用途的标识，如果自己...

5
0