字符编码

3,838 阅读2分钟

背景

页面需求,将一个含中文文案的js上传到amis,出现乱码:

image

字符编码种类

常见编码及其规则

如图,箭头方向为字符集扩充方向,箭头末端对始端兼容。

image

编码长度及范围

编码 长度 表示范围
ASCII 8bit 英文字母+符号
ISO-8859-1 1B(16bit) ASCII+欧洲语言
BIG 2B ASCII+繁体汉字(台湾)
GB2312 2B ASCII+简体汉字
GBK 2B BIG+GB2312+日韩汉字
GB18030 4B GBK+日语、韩语、少数民族文字
Unicode(UTF-8/12/16) 1-4B ASCII+全球文字

UTF8

UTF8用1-4B(8-32bit)表示字符,开始连续为1的bit数量表示B的数量:

1B:0xxxxxxx (就是ASCII)
2B:110xxxxx xxxxxxxx
3B:1110xxxx xxxxxxxx xxxxxxxx
4B:1111xxxx xxxxxxxx xxxxxxxx xxxxxxxx

虽然Unicode和GB系列都能表示汉字,但并不兼容,同一汉字两种编码是不一样的。

常见乱码样式原因

中文乱码多由编码方式和解码方式不一致导致,常见乱码如下:

乱码为复杂汉字

如,文件上传到amis后,“安徽省”变成“瀹夊窘鐪?” 【Utf编码】【GB解码】,一般在两套不同汉字编码方式的系统中 UTF-8用1-4B表示字符,“安徽省”三个字各用3B:e5ae89 e5bebd e79c81 GBK用2B表示字符,所以按e5ae 89e5 bebd e79c 81解析,得到:瀹夊窘鐪?

乱码为菱形问号

如,文件在VScode打开后:

image

菱形问号是Unicode字符"REPLACEMENT CHARACTER”,表示不能识别。 【GB编码】【Utf解码】 比如:“吃饭”,GBK编码:b3d4 b7b9 UTF8解码: 第一个B:b3—>10110011,不在UTF8编码内,� 第二个B:d4—>11010100,符合2B格式,解码d4b7,是个阿拉伯文:Է 第四个B:b9—>10111001,不在UTF8编码内,�

乱码为?

【ISO8859-1编码】【ISO8859-1解码】,一般在国外网站、软件中输入汉字产生 比如:“吃饭”,ISO8859-1编码,编码失败成:3f 3f 再解码:??

乱码为数学符号

【GB编码】【ISO8859-1解码】 比如:“你好”,GBK编码:4f60 597d ISO8859-1,1B,按4f 60 59 7d解码:ä½ å¥½

相关工具

在线编码、解码

tool.chinaz.com/tools/urlen…

vscode

默认跟随mac,utf-8,可以设置编码:

image