* 背景
日前遇到一封Apple Mail客户端发出来的邮件,字符集居然是 ISO-2022-CN,无奈Python2下面decode不支持,找了一圈,没发现iconv的python库(找了一个,不太好使),只好自己动手丰衣足食,以ctypes的方式,封装一个基于libc的iconv方法。
* 源码
# vim: set ts=4 et sw=4 sts=4 encoding=utf-8 :
"""
纯Python的iconv函数库 (以ctypes方式使用libc库)
"""
from ctypes import *
from ctypes.util import find_library
__all__ = ["iconv"]
def iconv(from_code, to_code, string):
"""
from_code: 解码前字符串字符集
to_code: 解码后字符串字符集
string: 需要解码的数据
"""
# 加载libc库
_libc = CDLL(find_library("libc.6.so"))
# 定义iconv_t指针类型
_iconv_t = c_void_p
# 声明iconv_open(3)原型
_iconv_open = _libc.iconv_open
_iconv_open.argtypes = [c_char_p, c_char_p]
_iconv_open.restype = _iconv_t
# 打开iconv句柄