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

Python UTF-8到ISO-8859-1编码:用最接近的等效字符替换特殊字符,python,encoding,utf-8,iso-8859-1,Python,Encoding,Utf 8,Iso 8859 1,有人知道Python库允许您以智能方式将UTF-8字符串转换为ISO-8859-1编码吗 所谓智能,我指的是用“-”之类的字符替换“–”之类的字符。对于许多无法想到等效字符的字符,请用“?”(如encode('iso-8859-1',errors='replace')替换)。我不知道有任何现有库,但有GPL2许可证,这意味着它可以用作另一个程序的基础。它的主要功能是对所有ASCII码点(128以下)进行特殊处理,使其保持不变。如果您只是将该处理扩展到拉丁字母(代码点低于256),您将得到一个特殊

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


所谓智能,我指的是用“-”之类的字符替换“–”之类的字符。对于许多无法想到等效字符的字符,请用“?”(如
encode('iso-8859-1',errors='replace')
替换)。

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


据我所知,没有超过255个字符应该映射到拉丁1非ascii字符,这应该可以做到这一点。

libiconv有一个“TRANSLIT”功能,可以实现您想要的功能

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

以下是关于Python 2和3的工作:

来自内置导入str
导入单解码
def unidecode_回退(e):
part=e.object[e.start:e.end]
替换=str(unidecode.unidecode(部分)或“?”)
退货(更换,如启动+透镜(零件))
编解码器。寄存器错误(“unidecode\u回退”,unidecode\u回退)

s=u'abcdé–fght这里是ASCII的缩写,但我不知道ISO-8859-1的缩写。@Markransem是的,unidecode可能是一个选项,但并不理想,因为它不会保留欧洲语言中常见的重音字符。请解释您的最后一句话。。。128以外的所有字符都是非ASCII字符,其中一些字符是拉丁字符1无需fork Unidecode,您可以使用生成器完成相同的任务:
“”。join(c if c@MarkRansom:在查看Unidecode源代码之后,出于性能原因,我只想避免对每个字符调用Unidecode。但是您的使用不太频繁,这就足够了。