自定义Python字符串编解码器具有不同长度的字符?

时间:2011-03-07 05:30:06

标签: python character-encoding

是否可以使用纯python代码创建自定义Python codec,其中该编解码器的字符可以是多个常规strunicode字符,就像在Python 2.x中的“unicode”编码中,两个ASCII字符可以是一个unicode字符? (例如,如果'。'和'%。'分别为1个字符,'.' in '%.'将为假。

如果可以,有没有办法让该编解码器与所有字符串方法一起正常工作? (所以,例如......

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

...会返回包含qwertyuio%.p

的元组

1 个答案:

答案 0 :(得分:2)

您当然可以提出一种自定义编码,它使用多个字节来表示单个字符。其中一个例子是UTF-8。

Python str类型存储字节,并且不知道用于生成这些字节的编码方案。例如,UTF-8使用2个字节来表示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'