2011-03-07 38 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