::: block-1
日常烦恼
日常平台账号的开通是我上班内容之一。记得之前有人抱怨说,为啥给我的密码不对啊。当然不可能是我开错,因为一个开账号的过程简直要把人逼疯,我就说我这边的过程部分(1、从工单系统把账号需求填入表格记录后续用于迎检。 2、打开堡垒机输入账号密码验证码 3、打开平台页面登录 4、创建对应账号、授权、分组 5、复制出初始密码回填表格记录 6、编辑邮件反馈对应人员 7、工单系统反馈)。整整7步,其中最费时间的是3、4、5步骤随着账号数量,这是随账号数量线性上升的工作量。所以我肯定用脚本去解决,当然不可能是我开错或者复制错。那这个问题到底怎么来的呢,会是用户输错么?下面我们就探究一下原因。
:::
Unicode编码
简介
在计算机初期只有ASCII码,最多只有8位,只能够表示256个字符,除了容纳英文字符和几个简单的符号无法容纳更多。随着各国开始使用计算机,为了融入各国的文字。就诞生出了很多编码,如中国用的GBK编码。但是这就引来另一个问题,这些编码在传输的时候两边如果编码不同也没做对应转换的话,那到对端很可能变成真正的天书。所以为解决这个问题就有了Unicode国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。其中UTF-8可变长(使用英文只需要1字节,使用特殊字符需要2字节或者3字节等)的编码就是Unicode编码的实现方式。数据库中经常见到的utf8mb4也是指uft8 most byte 4,最高到4字节,utf8mb3则是最高到3字节。对应如下表。
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 |
测试
测试之前我们看一下a = 'Αpple' ,b = 'Apple'
,其中a和b是一样的吧。下面我们实际看一下子!
>>> a = 'Αpple'
>>> b = 'Apple'
>>> print(a==b)
False
>>> bytes(a,'UTF-8').hex()
'ce9170706c65'
>>> bytes(b,'UTF-8').hex() #后面的数字基本一样,那问题基本是出在第一个A上。
'4170706c65'
>>> hex(ord('Α'))
'0x391'
>>> hex(ord('A')) #将单个字符转成10进制再转成16进制
'0x41'
通过把两个字符串转成UTF8的编码再转成16进制看下,可以发现两个确实不是同一个A。所以当我们输入密码时候肯定是不对的。那为什么会造成这个问题呢?原因可能有些人电脑用的编码不一致,有些个别字符会导致差异。同样使用电脑过程中不要随意修改电脑系统的编码,尽量使用通用的utf8编码。
当然除了这个情况,也有可能O和0的分不清1和小写的L 以及大写的i等
,在手动输入密码时候也是经常会错。
最后在声明一下,光在unicode编码中就存在很多易混淆的字符。
BNF语法介绍
在学习任何东西时候应当学会看官方文档,而在Python语法参考手册中1.2章节讲述的是后续章节用到的标注,用来对语法的解释。其实这里的标注是变种版的BNF语法标注,和标准版的稍微还有点区别,BNF语法其实有点像正则的用法。如下是BNF语法样例:
if_stmt ::= "if" assignment_expression ":" suite
("elif" assignment_expression ":" suite)*
["else" ":" suite]
::\= 表示“左侧是语法名称,右侧为语法规则的定义”
例:exponent ::= "a"..."z" 意思为语法exponent是由单个小写a到z字母组成.
| 表示“或者的意思”
例:exponent ::= "a"|"z" 意思为语法exponent只能是a或者z.
* 表示“对前一项重复0次或更多次”
例:exponent ::= ("a"..."z")* 意思为语法exponent是由0个(为空)或多个小写a到z字母组成.
+ 表示“对前一项重复1次或更多次”
例:exponent ::= ("a"..."z")+ 意思为语法exponent是由1个(不为空)或多个小写a到z字母组成.
[...] 表示“此项可选”
例:exponent ::= "test"["a"|"z"] 意思为语法exponent可以是testa也可以是testz也可以是test.
(...) 表示“分组”
例:exponent ::= "test"("a"|"z") 意思为语法exponent可以是testa也可以是testz,但不能是test.
<...> 表示“括起来的内容是对于所定义符号的非正式描述”
例:exponent ::= <This is a description,You can use any source character> 意思为语法exponent要满足这里的描述.
"..." 表示“引号中的字符序列本身,并非指代其它字”
例:exponent ::= test"()" 意思为语法exponent先使用test语法,后面需要接上括号。
如果test语法定义为由单个小写a到z字母组成,则当前exponent语法可以为 a()、b()...z()
:::: column
::: column-left
:::
::: column-right
:::
::::
客官,欢迎光临本站!路途遥远,常进来看看!
本文由mdnice多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。