- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
>> st 'Piperazine (perphenazine, \xef\xac\x-6ren">
当我写作时
>>> st = "Piperazine (perphenazine, fluphenazine)"
>>> st
'Piperazine (perphenazine, \xef\xac\x82uphenazine)'
发生了什么事?为什么它不对任何 fl
执行此操作?我该如何避免这种情况?
看起来\xef\xac\x82 实际上不是 fl
。有什么方法可以将这个字符“翻译”成 fl(正如作者所希望的那样),而不仅仅是通过类似
unicode(st, errors='ignore').encode('ascii')
最佳答案
这就是所谓的“连字”。
在打印中,f 和 l 字符之间的间距与正常的连续字母对不同——事实上,f 和 l 会合并为一个字符。其他连字包括“th”、“oe”和“st”。
这就是您在输入中得到的 - “fl”连字字符,UTF-8 编码。这是一个三字节序列。我会对你断言它“不是,事实上 fl
” 的小问题 - 它确实是,但你的输入是 UTF-8 而不是 ASCII :-)。我猜您是从 Word 文档或电子书或专为演示而不是数据保真度设计的东西(或者,从内容来看,它是 LaTeX 生成的 PDF?)粘贴的。
如果您想处理这种特殊情况,您可以用 ASCII 字母“fl”替换该字节序列。如果您想处理所有此类 情况,则必须使用 Unicode Consortium 的“UNIDATA”文件:http://www.unicode.org/Public/UNIDATA/UnicodeData.txt .在该文件中,有一列用于字符的“分解”。 f-l 连字的标识符为“LATIN SMALL LIGATURE FL”。顺便说一下,这个数据文件的 Python 模块位于 https://docs.python.org/2/library/unicodedata.html。 .你想要“分解”功能:
>>> import unicodedata
>>> foo = u"fluphenazine"
>>> unicodedata.decomposition(foo[0])
'<compat> 0066 006C'
0066 006C 当然是 ASCII“f”和“l”。
请注意,如果您尝试将 UTF-8 数据向下转换为 ASCII,您最终会遇到糟糕的一天。只有 127 个 ASCII 字符,而 UTF-8 有数百万个代码点。 UTF-8 中有许多代码点无法以非复杂的方式轻松表示为 ASCII - 谁希望某些文本最终显示为“<TREBLE CLEF> <SNOWMAN> <AIRPLANE> <YELLOW SMILEY FACE>
”?
关于python - 氟奋乃静读作\xef\xac\x82uphenazine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31553324/
我是一名优秀的程序员,十分优秀!