有时候我们会遇到文本文件乱码的问题,今天学习了一下文本文件的编码相关的知识,在这里记录一下。
为什么会乱码?
我们知道,计算机内储存的东西本质上是二进制数据,由于使用二进制表示位数太多,比较麻烦,所以多采用十六进制进行表示。中文经过编码变成十六进制储存在计算机,经过解码变成我们可以理解的文字。
文本文件乱码,问题就出在编码和解码的方式不一致。比如使用utf8编码的文件,却以gb2312的方式来解码。
文字 | UTF-8 | GB2312 |
---|---|---|
大 | E5 A4 A7 | B4 F3 |
一个文本文件,内容是E5 A4 A7
,使用UTF-8的方式解码,可以得到一个大
字,而用GB2312的方式解码,得到的是乱码。
UTF-8和Unicode的关系
简单来说,Unicode的目标就是给世界上每一个符号都给一个独一无二的编码,而UTF-8则是为了解决这个编码如何存储在计算机中的问题。
UTF-8 是 Unicode 的实现方式之一。
UTF-8是一种多字节编码的字符集,表示一个Unicode字符时,它可以是1个至多个字节,在表示上有规律:
Unicode符号范围(十六进制) | UTF-8编码方式(二进制) |
---|---|
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 |
手动换算理解UTF-8和Unicode
- 用
大
字举个例子,查到大
字的Unicode码为5927
,在0000 0800-0000 FFFF
之间,因此,它的UTF8编码需要占用三个字节。 - 把
5927
转化为二进制,得到101 1001 0010 0111
,填入1110xxxx 10xxxxxx 10xxxxxx
的x
处,不足的用0补足,最终得到11100101 10100100 10100111
,再转为十六进制,得到E5 A4 A7
这就是大
字的UTF-8编码。
最后更新时间:
2020-08-02 18:29:13