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)
但我想找到一种更通用,更清洁的方式.
谢谢你的帮助
除非您希望创建转换规则(如果您这样做,请查看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)
来自encode
docstring:
S.encode([encoding [,errors]]) - >字符串或unicode
使用注册用于编码的编解码器对S进行编码.encoding默认为默认编码.可以给出错误以设置不同的错误处理方案.默认为'strict',表示编码错误会引发UnicodeEncodeError.其他可能的值是"忽略","替代"和"xmlcharrefreplace"以及与codecs.register_error可以处理UnicodeEncodeErrors注册任何其他名称.
使用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).