Dar*_*rmo 3 python unicode uppercase python-3.7
当我偶然发现一个奇怪的结果时,我正在使用一个包含str.upper()和str.lower()函数的Python脚本。当我?向upper()函数传递字母(带有dasia和prosgegrammeni的大写字母Alpha,U + 1F89)时,结果??不是预期的?。
复制代码:
print('?'.upper())
Run Code Online (Sandbox Code Playgroud)
版画
??
Run Code Online (Sandbox Code Playgroud)
这是预期的行为还是某种错误?
编辑:我替换为正确的字符。
检查符号(例如,使用此在线工具)会告诉您您有一个U+1F89 GREEK CAPITAL LETTER ALPHA WITH DASIA AND YPROSGEGRAMMENI(不是U + 1F88)。
查找该术语,我们得到有关iota下标的 Wikipedia文章:
在仅大写字母的环境中,它再次表示为稍微减小的iota(小于常规的小写字母的iota)或全尺寸的大写字母的Iota。
您需要一个具有古希腊知识的人来验证这一点,但是乍一看,结果在逻辑上与您最初获得的结果相等。
现在,仔细阅读Unicode标准的3.13节,可以发现您所拥有的符号实际上是作为例外而明确提及的:
在D145中折叠案例之前调用规范分解(NFD规范化)是为了捕获非常少见的边缘案例。折叠之前不需要规范化,除了字符U + 0345组合希腊字母ypogegrammeni以及将其作为规范分解的一部分的任何字符(例如)
U+1FC3 greek small letter eta with ypogegrammeni。
而且,根据Wikipedia,
为了在全大写字母(“大写字母”)中使用,Unicode还规定了一种特殊的大小写映射规则,根据该规则,小写字母应映射到大写字母和大写iota(????)的组合。该规则不仅将单音的表示替换为双音的表示,而且还破坏了数字环境中任何大写字母的可逆性,因为大写字母和大写字母iota的组合通常会转换回小写字母和小写字母iota 。
显然,您在Unicode标准中遇到了一个奇怪的情况,因此这是可以预期的,而不是Python的bug str.upper()。
| 归档时间: |
|
| 查看次数: |
102 次 |
| 最近记录: |