2011-03-07 39 views
2

是否有可能使用纯Python代码制作自定义Python codec,其中该编解码器的字符可以多于一个常规strunicode字符,就像在Python 2.x中的“unicode”编码中的方式,两个ASCII字符可以是一个Unicode字符? (因此,例如,如果'。'和'%。'分别为1个字符,则'.' in '%.'将为假)具有不同长度字符的自定义Python字符串编解码器?

如果可能,是否有办法让编解码器与所有字符串方法一起正常工作? (所以,举例来说...

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

...会返回一个包含qwertyuio%.p元组)

回答

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' 
+1

你也可以有一个使用一个字节来表示多个字符的编码。 – dan04 2011-03-07 14:32:51

+0

非常真实,很好。 – samplebias 2011-03-07 14:34:38