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

2024-07-03 06:08:08 发布

您现在位置:Python中文网/ 问答频道 /正文

当我写作的时候

>>> st = "Piperazine (perphenazine, fluphenazine)"

>>> st

'Piperazine (perphenazine, \xef\xac\x82uphenazine)'

发生了什么事?为什么它对任何fl都不这样做?如何避免这种情况?你知道吗

看起来\xef\xac\x82实际上不是fl。有没有什么方法可以把这个字符“翻译”成fl(正如作者的意图),而不只是通过类似的方式排除它

 unicode(st, errors='ignore').encode('ascii') 

Tags: 方法方式情况作者字符意图stx82
1条回答
网友
1楼 · 发布于 2024-07-03 06:08:08

这就是所谓的“结扎”。你知道吗

在印刷中,f和l字符的排版间距不同于正常的连续字母对,事实上,f和l会合并成一个字符。其他连字包括“th”、“oe”和“st”。你知道吗

这就是你在输入中得到的东西-“fl”连字字符,UTF-8编码。这是一个三字节的序列。我对你的断言有一点小小的异议,那就是“不是,事实上fl”——确实是,但你的输入是UTF-8,而不是ASCII:-)。我猜你是从Word文档或电子书或是为演示而设计的东西粘贴的,而不是数据保真度(或者,从内容来看,它是一个由LaTeX生成的PDF?)。你知道吗

如果您想处理这种特殊情况,可以用ASCII字母“fl”替换该字节序列。如果您想处理所有这样的情况,就必须使用Unicode联合体的“UNIDATA”文件:http://www.unicode.org/Public/UNIDATA/UnicodeData.txt。在该文件中,有一列用于字符的“分解”。f-l连字的标识符是“拉丁文小型连字FL”。顺便说一下,这个数据文件在https://docs.python.org/2/library/unicodedata.html有一个Python模块。您需要“分解”函数:

>>> 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>”?你知道吗

相关问题 更多 >