自定义Python字符串编解码器支持不同长度字符?

2 投票
1 回答
712 浏览
提问于 2025-04-16 13:08

有没有办法用纯Python代码制作一个自定义的编码器,让这个编码器中的一个字符可以由多个普通的 strunicode 字符组成?就像在Python 2.x中的“unicode”编码那样,两个ASCII字符可以变成一个unicode字符?(举个例子,如果 '.' 和 '%.' 各自都是一个字符,那么 '.' in '%.' 的结果会是假的)

如果可以做到这一点,有没有办法让这个编码器和所有字符串方法正常工作?(比如...

a = 'qwerty.uio%.p'.encode('aencoding')
a.split('.'.encode('aencoding'))

...会返回一个包含 qwertyuio%.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'

撰写回答