• 通过查看编码映射表确定编码类型


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

    # _*_coding:utf-8_*_
    
    s = '编程'
    
    s1 = s.decode('utf-8')  # 将s抓换成换成unicode编码
    s2 = s1.encode('utf-8')  # 将s1从unicode转换成utf-8
    s3 = s1.encode('gbk')  # 将s2从unicode换换成gbk
    
    print(s2, s3, s1)  # ('xe7xbcx96xe7xa8x8b', 'xb1xe0xb3xcc', u'u7f16u7a0b')

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

    编,7f16

    程,7a0b

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

    # 编 7f16(unicode的值)  G0-3160(gbk的值)
    # xb1xe0  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
    # xb3xcc  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的字节被称为高字节。那为什么xb1xe0要把128所在的位去掉(把1变成0)才能与unicode的G0-3160对上呢?这只能说是unicode在映射表的表达上直接忽略了高字节,但真正映射的时候 ,肯定还是需要用高字节的。

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

  • 相关阅读:
    linux ls
    ExtJs 弹出窗口
    Redhat5 装中文
    Linux下配置JDK以及报cannot restore segment prot after reloc: Permission denied错解决方案
    工具
    得到剪切的图片
    label button等设置不同颜色的标题
    UITableView UITextField 键盘挡住
    给出颜色生成图片
    一个不错的学习网站
  • 原文地址:https://www.cnblogs.com/lshedward/p/9924667.html
Copyright © 2020-2023  润新知