如何在Python中将Unicode编码规范化以用于ISO-8859-15转换?

4
我想将Unicode字符串转换为iso-8859-15。这些字符串包括不属于iso-8859-15字符集的"\u2019"(右单引号标记,请参见http://www.fileformat.info/info/unicode/char/2019/index.htm)字符。

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

我查看了unicodedata模块,但没有成功。我成功地使用

s.replace(u"\u2019", "'").encode('iso-8859-15')

但我希望能找到一种更普遍和更清洁的方法。

感谢您的帮助。


请记住,ISO 8859-X 中的所有代码点都在 Unicode 中,但反过来则不成立。如果您的文本包含非欧洲字符,则转换将失败。 - dda
3个回答

6

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

s.translate({ord(u"\u2019"):ord(u"'")})
unicode版本的translate方法的参数是一个将unicode序数映射到unicode序数的字典。在此字典中添加其他无法编码为目标编码的字符。
您可以以更易读的形式构建映射表,并从中创建映射字典,例如:
char_mappings = [(u"\u2019", u"'"),
                 (u"`", u"'")]
translate_mapping = {ord(k):ord(v) for k,v in char_mappings}

来自翻译文档:

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


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'

来自encode文档字符串:

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

使用为编码注册的编解码器对S进行编码。默认情况下,编码为默认编码。可以给出错误以设置不同的错误处理方案。默认值为“strict”,意味着编码错误会引发UnicodeEncodeError。其他可能的值包括“ignore”、“replace”和“xmlcharrefreplace”,以及任何使用codecs.register_error注册的名称,可以处理UnicodeEncodeErrors。


4

关于此问题的最终解决方案:

iso885915_utf_map = {
    u"\u2019":  u"'",
    u"\u2018":  u"'",
    u"\u201c":  u'"',
    u"\u201d":  u'"',
}
utf_map = dict([(ord(k), ord(v)) for k,v in iso885915_utf_map.items()])
s.translate(utf_map).encode('iso-8859-15')

谢谢您的帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接