前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >编码漫谈

编码漫谈

作者头像
老高的技术博客
发布2022-12-27 21:48:35
2560
发布2022-12-27 21:48:35
举报

编码一定是程序员永远的痛,不知道老高能不能救到你。

以下命令的操作环境:centos6 + python2.6

基础知识

Unicode

Unicode用数字0-0x10FFFF来映射字符,最多可以容纳1114112个字符,或者说有1114112个码位,理论上是足够用的。

在python中如何找到Unicode?

一个典型的Unicode
一个典型的Unicode

UTF-8

UTF-8(8-bit Unicode Transformation Format)指的是Unicode的一种压缩方式,UTF-8用1到6个字节编码UNICODE字符,长度不定。

代码语言:javascript
复制
Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

老 高的Unicode编码是C0CF B8DF,UTF-8的编码是 \xe8\x80\x81 \xe9\xab\x98\x表示后面两位数字是16进制,的我们把\x去掉,得到e88081 e9ab98,将其转为二进制,得到:

代码语言:javascript
复制
11101000 10000000 10000001
11101001 10101011 10011000
1110xxxx 10xxxxxx 10xxxxxx  <----- 落到了上表的第三个区间

ASCII兼容

GBK汉字内码扩展规范,简称国标。 GB2312信息交换用汉字编码字符集。 大五码(Big5),又称为大五码或者五大码,是通行于台湾、香港地区的一个繁体字编码方案。

你能说出划线部分都是什么编码格式吗?

编码小测试
编码小测试

顺便扒一扒最近很火的能让IOS死机的字符

IOS死机的字符
IOS死机的字符

编码检测工具

代码语言:javascript
复制
pip install chardet

### 使用方法

from chardet import detect
print detect('abc')

get:

{'confidence': 1.0, 'encoding': 'ascii'}

编码实验

实验1

代码语言:javascript
复制
s = '老高@phper'
detect(s)

get:
{'confidence': 0.75249999999999995, 'encoding': 'utf-8'}

猜测1:python高版本中字符初始化直接为unicode编码。

实验2

代码语言:javascript
复制
s = '老高@phper'
u = s.decode('utf-8')
u
u.encode('gbk')
s.encode('gbk')

get:
>>> u
u'\u8001\u9ad8@phper'
>>> u.encode('gbk')
'\xc0\xcf\xb8\xdf@phper'
>>> s.encode('gbk')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 0: ordinal not in range(128)

猜测2:字符编码的转换必须经过unicode,即如果需要将utf-8转为gbk,必须decodeencode

你知道decode和encode都是做什么的吗?

实验3

代码语言:javascript
复制
# 接上面
type(s)
type(u)
a = dir(s)
b = dir(u)
list(set(a) ^ set(b))

get:
>>> type(s)
<type 'str'>
>>> type(u)
<type 'unicode'>
>>> a = dir(s)
>>> b = dir(u)
>>> list(set(a) ^ set(b))
['isdecimal', 'isnumeric']
>>>

猜测3:普通的str与unicode没有什么区别,['isdecimal', 'isnumeric']两个方法是unicode类独有的。

reference:

https://docs.python.org/2/library/stdtypes.html?highlight=isdecimal#unicode.isnumeric

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-01-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基础知识
    • Unicode
      • UTF-8
        • ASCII兼容
        • 编码检测工具
        • 编码实验
          • 实验1
            • 实验2
              • 实验3
              相关产品与服务
              检测工具
              域名服务检测工具(Detection Tools)提供了全面的智能化域名诊断,包括Whois、DNS生效等特性检测,同时提供SSL证书相关特性检测,保障您的域名和网站健康。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
              http://www.vxiaotou.com