UTF-8到ISO-8859-1编码:用最接近的等价物替换特殊字符

时间:2017-11-08 14:01:10

标签: python encoding utf-8 iso-8859-1

有没有人知道允许您以智能方式将UTF-8字符串转换为ISO-8859-1编码的Python库?

聪明地说,我的意思是替换像#34; - " by" - "或者。而对于许多人物而言,实际上无法想到它们,请用"?" (比如encode('iso-8859-1', errors='replace'))。

3 个答案:

答案 0 :(得分:1)

我不知道任何现有的库,但Unidecode具有GPL 2许可证,这意味着它可以用作另一个程序的基础。它的主要功能是对所有ASCII码点(低于128)进行特殊处理,使其保持不变。如果您只是将该处理扩展为Latin1字母(代码点低于256),您将获得一个特殊版本,该版本保留Latin1字符并对所有其他字符使用unidecode。

我知道不应该将255以外的字符映射到latin1非ascii字符,这应该可以解决问题。

答案 1 :(得分:1)

libiconv有一个" TRANSLIT"做你想做的功能

答案 2 :(得分:1)

由于Unicode的前256个代码点与ISO-8859-1匹配,因此可以尝试编码为ISO-8859-1,它将处理所有字符0到255而没有错误。对于导致编码错误的字符,可以使用unidecode。

以下适用于Python 2和3:

from builtins import str
import unidecode

def unidecode_fallback(e):
    part = e.object[e.start:e.end]
    replacement = str(unidecode.unidecode(part) or '?')
    return (replacement, e.start + len(part))

codecs.register_error('unidecode_fallback', unidecode_fallback)

s = u'abcdé–fghijkl'.encode('iso-8859-1', errors='unidecode_fallback')
print(s.decode('iso-8859-1'))

结果:

abcdé-fgh?ijkl

然而,这会将非ISO-8859-1字符转换为ASCII等效字符,而有时候使用非ASCII,ISO-8859-1等效字符可能更好。

相关问题