字符集和编码规则的背景知识
ASCII
American Standard Code for Information Interchange美国标准信息交换码
只能表示128个字符
这个大家都是很熟悉的,从32是空格,然后是一堆符号,然后是48~57表示0~9,65~90是A~Z,97~122是a~z。
就是很少,也只有英文字母
Windows:ANSI
然后发展到了ANSI
HTML4:ISO-8859-1
ISO-8859-1
在html5之前,做网站,经常要把前台的数据为ISO-8859-1转换为UTF-8然后再进行使用。
HTML5:UTF-8
Unicode联盟(Unicode Consortium)开发了Unicode标准(Unicode Standard)。他们的目标是使用标注的Unicode转换格式,即UTF(Unicode Transformation Format)取代现有的字符集。
Unicode 是一种包含所有字符的编码表格(字符集)。utf-8是一种编码规则。
主要目的是为了不浪费流量,可变长。
UTF-8的字符可以是1到4字节长。UTF-8 可以代表 Unicode 标准中的任何字符。UTF-8 向后兼容 ASCII。UTF-8 是电子邮件和网页的首选编码。
全角半角的清洗
等中国人们得到计算机时,已经没有可以利用的字节状态来表示汉字,况且有6000多个常用汉字需要保存呢。但是这难不倒智慧的中国人民,我们不客气地把那些127号之后的奇异符号们直接取消掉, 规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,我们还把数学符号、罗马希腊的字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的”全角”字符,而原来在127号以下的那些就叫”半角”字符了。中国人民看到这样很不错,于是就把这种汉字方案叫做 “GB2312“。GB2312 是对 ASCII 的中文扩展。
具体规则为:
全角字符unicode编码从65281~65374 (十六进制 0xFF01 ~ 0xFF5E)
半角字符unicode编码从33~126 (十六进制 0x21~ 0x7E)
空格比较特殊,全角为 12288(0x3000),半角为 32(0x20)
而且除空格外,全角/半角按unicode编码排序在顺序上是对应的(半角 + 65248 = 全角)
所以可以直接通过用+-法来处理非空格数据,对空格单独处理。
def DBC2SBC(string):
rstring = ""
for uchar in string:
inside_code = ord(uchar)
if inside_code == 0x3000:
inside_code = 0x0020
else:
inside_code -= 0xfee0
if inside_code < 0x0020 or inside_code > 0x7e:
rstring += uchar
else:
rstring += chr(inside_code)
return rstring
全角半角的映射还是很值得看一下的
for i in range(33, 127):
print(i, chr(i), i+65248, chr(i+65248))
网页上爬取的内容的问题
reference
https://www.jb51.net/article/98443.htm
https://www.zhihu.com/question/23374078
https://blog.csdn.net/tcf_jingfeng/article/details/80134600
https://wenku.baidu.com/view/cb9fe505cc17552707220865.html