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

标签 python unicode

当我写作时

>>> 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/

相关文章:

http - 关于 URL UTF-8 编码,浏览器或 Web 服务器正在做什么 "behind the scenes"?

.net - 有没有办法在 Windows 控制台中编写希伯来语?

python - 在 Python unicode 字符串中删除重音(规范化)的最佳方法是什么?

python - 自定义 django admin ChangeForm 模板/添加自定义内容

python - 在 NumPy 数组中使用 array.dtype = <data type> 分配 dtype 值会产生不明确的结果

python - 数据框使列代表向量

Node.JS 抓取编码?

python - 在 python 中添加二进制数需要帮助

python - 如何计算列表中唯一值的出现次数

javascript - 为什么 '❌' [0] === '❌' 但 '✔️' [0] !== '✔️' ?