自定义Python字符串编解码器支持不同长度字符?
有没有办法用纯Python代码制作一个自定义的编码器,让这个编码器中的一个字符可以由多个普通的 str
或 unicode
字符组成?就像在Python 2.x中的“unicode”编码那样,两个ASCII字符可以变成一个unicode字符?(举个例子,如果 '.' 和 '%.' 各自都是一个字符,那么 '.' in '%.'
的结果会是假的)
如果可以做到这一点,有没有办法让这个编码器和所有字符串方法正常工作?(比如...
a = 'qwerty.uio%.p'.encode('aencoding')
a.split('.'.encode('aencoding'))
...会返回一个包含 qwerty
和 uio%.p
的元组)
1 个回答
2
你当然可以设计一种自定义的编码方式,用多个字节来表示一个字符。UTF-8就是一个这样的例子。
在Python中,str
类型用来存储字节,但它并不知道这些字节是用什么编码方式生成的。比如,UTF-8用两个字节来表示unicode字符'\u00f1'
:
>>> s1 = u'\u00f1'.encode('utf-8')
>>> s1
'\xc3\xb1'
而且,str
的操作并不知道字节'\xc3\xb1'
其实代表的是一个字符:
>>> '\xc3' in s1
True
>>> s1.__contains__('\xc3')
True
在设计你的编码时,你可能需要考虑一些问题:你需要编码多少个不同的符号?除了'%'
,你还有其他的转义字符吗?你只处理1字节和2字节的序列吗?
如果不了解你的编码方式,我可以给你一个可能的例子。你可以把你的str
表示转换成unicode
,然后使用它的高效方法来比较、分割和连接你的值:
>>> s1 = '.'.decode('aencoding')
>>> s1
u'\u002e'
>>> s2 = 'x.y%.z'.decode('aencoding')
>>> s2
u'\u0078\u002e\u0079\u252e\u007a'
>>> s2.split(s1)
[u'x', u'y\u252ez'
>>> u'y\u252ez'.encode('aencoding')
'y%.z'