4

我想将 unicode 字符串转换为 iso-8859-15。这些字符串包括u"\u2019"(右单引号参见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')

但我想找到一种更通用、更清洁的方法。

谢谢你的帮助

4

3 回答 3

6

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

s.translate({ord(u"\u2019"):ord(u"'")})

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

您可以以更具可读性的形式构建映射表并从中创建映射字典,例如:

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 的字符被删除。请注意,更灵活的方法是使用 codecs 模块创建自定义字符映射编解码器(参见 encodings.cp1251 示例)。

于 2012-05-28T13:25:28.120 回答
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 进行编码。encoding 默认为默认编码。可能会给出错误以设置不同的错误处理方案。默认为“严格”,表示编码错误会引发 UnicodeEncodeError。其他可能的值是 'ignore'、'replace' 和 'xmlcharrefreplace' 以及使用 codecs.register_error 注册的可以处理 UnicodeEncodeErrors 的任何其他名称。

于 2012-05-28T13:34:42.587 回答
3

有关信息,我的最终解决方案:

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')

感谢您的帮助

于 2012-05-28T14:30:18.277 回答