氟奋乃静读作\ xef\xac\x82uphenazine

use*_*er0 5 python unicode

当我写作

>>> st = "Piperazine (perphenazine, ?uphenazine)"

>>> st

'Piperazine (perphenazine, \xef\xac\x82uphenazine)'
Run Code Online (Sandbox Code Playgroud)

怎么了?为什么不这样做fl呢?我该如何避免这种情况?

事实上它看起来不是\ xef\xac\x82 fl.有没有办法将这个角色"翻译"成fl(正如作者所预期的那样),而不是通过类似的东西将其排除

 unicode(st, errors='ignore').encode('ascii') 
Run Code Online (Sandbox Code Playgroud)

Bor*_*lid 8

这就是所谓的"结扎".

在打印中,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.在该文件中,有一列用于字符的"分解".fl结扎具有标识符"LATIN SMALL LIGATURE FL".顺便提一下,这个数据文件的Python模块位于https://docs.python.org/2/library/unicodedata.html.你想要"分解"功能:

>>> import unicodedata
>>> foo = u"?uphenazine"
>>> unicodedata.decomposition(foo[0])
'<compat> 0066 006C'
Run Code Online (Sandbox Code Playgroud)

0066 006C当然是ASCII'f'和'l'.

请注意,如果您尝试将UTF-8数据转发为ASCII,那么您最终将度过糟糕的一天.只有127个ASCII字符,UTF-8拥有数百万个代码点.UTF-8中有许多代码点,不能以非卷积的方式表示为ASCII - 谁想让一些文本最终说" <TREBLE CLEF> <SNOWMAN> <AIRPLANE> <YELLOW SMILEY FACE>"?