如何在python中规范化iso-8859-15转换的unicode编码?

luc*_*luc 3 python unicode encoding utf-8 iso-8859-15

我想将unicode字符串转换为iso-8859-15.这些字符串包括u"\u2019"(RIGHT SINGLE QUOTATION MARK参见http://www.fileformat.info/info/unicode/char/2019/index.htm)字符,该字符不是iso-8859-15字符集的一部分.

在Python中,如何规范化unicode字符以匹配iso-8859-15编码?

我看过unicodedata模块没有成功.我设法完成这项工作

s.replace(u"\u2019", "'").encode('iso-8859-15')
Run Code Online (Sandbox Code Playgroud)

但我想找到一种更通用,更清洁的方式.

谢谢你的帮助

Lev*_*sky 6

除非您希望创建转换规则(如果您这样做,请查看Boud的答案),您可以选择其中一个默认错误处理程序,encode或者甚至注册您自己的错误处理程序:

In [4]: u'\u2019 Hi'.encode('iso-8859-15', 'replace')
Out[4]: '? Hi'

In [5]: u'\u2019 Hi'.encode('iso-8859-15', 'ignore')
Out[5]: ' Hi'

In [6]: u'\u2019 Hi'.encode('iso-8859-15', 'xmlcharrefreplace')
Out[6]: '’ Hi'
Run Code Online (Sandbox Code Playgroud)

来自encodedocstring:

S.encode([encoding [,errors]]) - >字符串或unicode

使用注册用于编码的编解码器对S进行编码.encoding默认为默认编码.可以给出错误以设置不同的错误处理方案.默认为'strict',表示编码错误会引发UnicodeEncodeError.其他可能的值是"忽略","替代"和"xmlcharrefreplace"以及与codecs.register_error可以处理UnicodeEncodeErrors注册任何其他名称.


Bou*_*oud 5

使用translate函数的unicode版本,假设s是一个unicode字符串:

s.translate({ord(u"\u2019"):ord(u"'")})
Run Code Online (Sandbox Code Playgroud)

unicode版本的参数translate是将unicode序列映射到unicode序列的dict.添加到此dict中您无法在目标编码中编码的其他字符.

您可以用更易读的形式构建映射表,并从中创建映射表,例如:

char_mappings = [(u"\u2019", u"'"),
                 (u"`", u"'")]
translate_mapping = {ord(k):ord(v) for k,v in char_mappings}
Run Code Online (Sandbox Code Playgroud)

来自翻译文档:

对于Unicode对象,translate()方法不接受可选的deletechars参数.相反,它返回s的副本,其中所有字符都已通过给定的转换表进行映射,该转换表必须是Unicode序列到Unicode序列,Unicode字符串或None的映射.未映射的字符保持不变.映射到"无"的字符将被删除.注意,更灵活的方法是使用编解码器模块创建自定义字符映射编解码器(有关示例,请参阅encodings.cp1251).