Marc-Andre Lemburg: support pickling Unicode objects, both in text
mode ('V') and in binary mode ('X').
diff --git a/Lib/pickle.py b/Lib/pickle.py
index a958dcd..ebfde4f 100644
--- a/Lib/pickle.py
+++ b/Lib/pickle.py
@@ -64,6 +64,8 @@
STRING = 'S'
BINSTRING = 'T'
SHORT_BINSTRING = 'U'
+UNICODE = 'V'
+BINUNICODE = 'X'
APPEND = 'a'
BUILD = 'b'
GLOBAL = 'c'
@@ -275,6 +277,23 @@
memo[d] = (memo_len, object)
dispatch[StringType] = save_string
+ def save_unicode(self, object):
+ d = id(object)
+ memo = self.memo
+
+ if (self.bin):
+ encoding = object.encode('utf-8')
+ l = len(encoding)
+ s = mdumps(l)[1:]
+ self.write(BINUNICODE + s + encoding)
+ else:
+ self.write(UNICODE + object.encode('raw-unicode-escape') + '\n')
+
+ memo_len = len(memo)
+ self.write(self.put(memo_len))
+ memo[d] = (memo_len, object)
+ dispatch[UnicodeType] = save_unicode
+
def save_tuple(self, object):
write = self.write
@@ -566,6 +585,15 @@
self.append(self.read(len))
dispatch[BINSTRING] = load_binstring
+ def load_unicode(self):
+ self.append(unicode(self.readline()[:-1],'raw-unicode-escape'))
+ dispatch[UNICODE] = load_unicode
+
+ def load_binunicode(self):
+ len = mloads('i' + self.read(4))
+ self.append(unicode(self.read(len),'utf-8'))
+ dispatch[BINUNICODE] = load_binunicode
+
def load_short_binstring(self):
len = mloads('i' + self.read(1) + '\000\000\000')
self.append(self.read(len))