博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通过查看编码映射表确定编码类型
阅读量:5819 次
发布时间:2019-06-18

本文共 1266 字,大约阅读时间需要 4 分钟。

如何判断字符串是由何种编码编写的呢?最简单粗暴的方法是靠字节个数来判断,直接上代码:

# _*_coding:utf-8_*_s = '编程's1 = s.decode('utf-8')  # 将s抓换成换成unicode编码s2 = s1.encode('utf-8')  # 将s1从unicode转换成utf-8s3 = s1.encode('gbk')  # 将s2从unicode换换成gbkprint(s2, s3, s1)  # ('\xe7\xbc\x96\xe7\xa8\x8b', '\xb1\xe0\xb3\xcc', u'\u7f16\u7a0b')

需要注意的事s1,s2,s3放在一起就会打印出16进制字节,这是内置方法。第一个占3个字节可以推断出是utf-8,第二个占2字节可以推断出是gbk。第三个可以在unicode映射表中直接查出来。其中u代表unicode,每2个代表1个字节。

编,7f16

程,7a0b

 

编程对应的gbk编码是\xb1\xe0\xb3\xcc,但是和7f16,7a0b对不上,把他们转成二进制并把开头的1去掉(从高字节变成低字节)得到3160和334c。

# 编 7f16(unicode的值)  G0-3160(gbk的值)# \xb1\xe0  1和0对上了 # b       1# 1011    0001# 把第一位变成0# 0011    0001 -> 转换成10进制  3 1# e       0# 1110    0000# # 把第一位变成0# 0110    0000 -> 转换成10进制  6 0# 程 7a0b  G0-334C# xb3\xcc  3和c对上了# b       3# 1011    0011# # 把第一位变成0# 0011    0011 -> 转换成10进制 33# c       c# 1100    1100# # 把第一位变成0# 0100    1100 -> 转换成10进制 4c

 

可以看到对上了。原因是GBK兼容ASCII码,1个字节是英文,2个字节是中文。那么2个字节连到一起的话,如何判断是中文还是英文呢?由于在ASCII码中,0-127是常用的,128-255是一些乱七八糟、不常用的扩展表,所以,干脆从128开始就代表中文。所以,2个字节连在一起,如果每个字节的第1位(也就是相当于128的那个2进制位)如果是1,就代表这是个中文,这个首位是128的字节被称为高字节。那为什么\xb1\xe0要把128所在的位去掉(把1变成0)才能与unicode的G0-3160对上呢?这只能说是unicode在映射表的表达上直接忽略了高字节,但真正映射的时候 ,肯定还是需要用高字节的。

 

参考:https://www.cnblogs.com/alex3714/articles/7550940.html

转载于:https://www.cnblogs.com/lshedward/p/9924667.html

你可能感兴趣的文章
Android图片添加水印图片并把图片保存到文件存储
查看>>
比特币系统采用的公钥密码学方案和ECDSA签名算法介绍——第二部分:代码实现(C语言)...
查看>>
海贼王十大悲催人物
查看>>
BigDecimal 舍入模式(Rounding mode)介绍
查看>>
开源 免费 java CMS - FreeCMS1.2-标签 infoSign
查看>>
开源 免费 java CMS - FreeCMS1.9 移动APP生成栏目列表数据
查看>>
虚拟机新增加硬盘,不用重启读到新加的硬盘
查看>>
Java IO流详尽解析
查看>>
邮件服务系列之四基于虚拟用户的虚拟域的邮件系统(安装courier-authlib以及部分配置方法)...
查看>>
Linux VSFTP服务器
查看>>
DHCP中继数据包互联网周游记
查看>>
Squid 反向代理服务器配置
查看>>
Java I/O操作
查看>>
Tomcat性能调优
查看>>
项目管理心得
查看>>
Android自学--一篇文章基本掌握所有的常用View组件
查看>>
灰度图像和彩色图像
查看>>
通过vb.net 和NPOI实现对excel的读操作
查看>>
TCP segmentation offload
查看>>
java数据类型
查看>>