python rtsp转换为图片_化异为同,Python 在背后帮你做的转换

7de4b9345f5594db77449beea80cd58e.png

摄影:产品经理 又是产品经理自己去吃的烤肉

我们先来看一段代码,这段代码似乎触发了Python的bug:

>>> ? = 1>>> f = 2>>> print(?)

运行效果如下图所示:

f1e83a0a0afe243d35edf9fc67f9d952.png

我们知道,Python 的变量名是可以使用 Unicode 字符的,也就是非英文字母也可以当做变量名,例如:

8fddbd9d70d8c641aca88494d4dd2dd8.png

如果大家仔细观察,就会发现上面的?和英文字母f不是同一个字符。

84d18372f7948a2c455f676d411a48db.png

那为什么当我们给f赋值为2以后,原来?的值也改变了呢?这是因为,Python 会把所有的变量名转换为它的 NFKC 等价形式。

从Python的官方文档2.3. Identifiers and keywords[1]中,我们可以看到:

All identifiers are converted into the normal form NFKC while parsing; comparison of identifiers is based on NFKC.

转换的原理可以参阅维基百科:Unicode equivalence - Wikipedia[2]

Python已经自带了一个转换的模块,叫做unicodedata,通过它,我们可以把非标准的Unicode字符转成标准的Unicode字符,例如:

>>> import unicodedata>>> unicodedata.normalize('NFKC', '?')'f'>>> unicodedata.normalize('NFKC', '?') == 'f'True

可以看到,手写字符?通过 NFKC 标准转换以后,就是普通的字母f,所以在 Python 里面,如果作为变量名,这两个字符是一样的。

除了英文字符外,中文字符也可以转换。大家应该还记得我之前讲康熙字符那篇文章:康熙部首导致的字典查询异常我们可以使用相同的方式,把康熙部首里面的转换为标准的汉字

>>> unicodedata.normalize('NFKC', '⽐') == '比'True

这样一来,如果你需要做一个服务,它接收用户的输入,但你又不想让用户输入这种长得像中文或者英文,但是却又不是的怪异字符,你就可以使用 NFKC 把它转换为标准的字符。例如,把中文逗号转成英文逗号,把中文分号转成英文分号,把中文冒号转成英文冒号等等:

5bd12a1ceec70193b7f456c6a123af36.png

参考资料

[1]

2.3. Identifiers and keywords: https://docs.python.org/3/reference/lexical_analysis.html#identifiers

[2]

Unicode equivalence - Wikipedia: https://en.wikipedia.org/wiki/Unicode_equivalence#Normalization

044224cb7e65be0ceea774dc08962f6e.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值