iview乱码问题处理与反思

434 阅读4分钟

iview乱码问题处理与反思

问题描述

某天突然返现,原本正常的iview的分页器组件原本是省略号的地方突然变成乱码了

image.png 突然返现对这方面内容比较生疏,遂借此机会整理相关原理。

解决过程

首先查看相关css样式,发现iview实现省略号的相关代码如下:

    :after {
        content: "\2022\2022\2022"
    }

自己验证一番,这种样式确实可以展示成省略点号。

image.png

这里引出第一个问题:问题1:为什么【\2022】会显示成 •
首先在cssTrick中找到XHTML的特殊字符表说明unicode编码表,从中可以找到如下对应关系

image.png image.png 对照一下上面两张表解释一下这些编码的含义

编码详情
•【&bull ;】html中的特殊实体(entity),可以被html直接识别
&#8226•的unicode编码
U202216进制编码,这里也就是8226的16进制的值
U2219是另一个.字符的编码,这是列出只表明这两个不是一个字符

所以可以知道2022是省略号的unicode编码,第一个问题得以解决。


接下来就是 问题2: 要如何处理该乱码问题 对症下药就非常块了,直接找到关于css@charset的描述。
给出了如下关于识别文件编码的说明:

image.png 简单来说就是:
文件本身的字节顺序标记 >
响应头中content-type的charset字段 >
css文件中的@charset申明 >
link中的charset申明(虽然上面说被飞起了,但是尝试了下还是生效的)>
默认为utf8格式

最终增加了css的@charset头,问题得以解决

但是仍然存在问题 问题2-引伸: 不申明@charset为什么会乱码,并且是偶现
按照MDN的说法,当文件中不存在任何charset申明的时候,默认是以utf-8的格式解析的。那么就算不加@charset,应该也不会出现乱码的。
这个问题在之后的文档浏览中有所发现:

image.png

而出现乱码的css中存在font-family: 微软雅黑; 因此导致css解析出现乱码

到此从项目的角度上该问题应该已经算是解决了,但是在处理的过程中发现了一个点理解不清 问题3:ASC码,unicode, UTF8,gbk有什么区别? 知识点的问题直接查阅就行了,这里发现了一篇写的比较好的知乎回答

这里简单归纳一下:
ASC码:最初使用一个字节的编码,主要包括字母大小写,各种符号等共127个。还加入了很多画表格时需要用下到的横线、竖线、交叉等形状,一直把序号编到了最后一个状态255。从128 到255这一页的字符集被称【扩展字符集】“。
unicode:国际标准编码,规定必须用两个字节,也就是16位来统一表示所有的字符。这时候ASC码这类只需要一个字节的字符,前面就全是0了,存在空间浪费
utf8: 变长编码规范

  1. 单字节的字符,字节的第一位设为0,对于英语文本,UTF-8码只占用一个字节,和ASCII码完全相同;

  2. n个字节的字符(n>1),第一个字节的前n位设为1,第n+1位设为0,后面字节的前两位都设为10,这n个字节的其余空位填充该字符unicode码,高位用0补足。

这样就形成了如下的UTF-8标记位

0xxxxxxx

110xxxxx 10xxxxxx

1110xxxx 10xxxxxx 10xxxxxx

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

gbk:纯中文编码。把那些127号之后的奇异符号们直接取消掉, 规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,我们还把数学符号、罗马希腊的字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的”全角”字符,而原来在127号以下的那些就叫”半角”字符了。中国人民看到这样很不错,于是就把这种汉字方案叫做 “GB2312“。GB2312 是对 ASCII 的中文扩展。

到此完成整个问题从原理到项目实现的解决。