2013-06-08 2 views
1

я закодировать символ «а» pyDes и я хочу, чтобы расшифровать егоКак расшифровать строку Фрум textbuffer.get_text

text = self.textbuffer.get_text(start, end) 
    print text 
    //',\xcc\x08\xe5\xa1\xa1fc' 
    x = "{}".format(text) 
    print x 
    //',\xcc\x08\xe5\xa1\xa1fc' 
but i need 
    //,塡fc 

когда я делаю

cipher_text = ',\xcc\x08\xe5\xa1\xa1fc' 
print cipher_text 
//,塡fc 

почему

text = self.textbuffer.get_text(start, end) 
didn't return me a good string ? 

Ваше решение не работает здесь, но я делаю ход:

text = self.textbuffer.get_text(start, end) 
a = text.decode('unicode-escape') 
g = a.encode('utf-16be') 

это почти хорошо, но когда я делаю

print g 
//',���fc' 
print "%r"%g 
//"\x00'\x00,\x00\xcc\x00\x08\x00\xe5\x00\xa1\x00\xa1\x00f\x00c\x00'" 

Теперь у меня есть проблема с тем, как удалить все \ x00 здесь

newstr = g.replace("\x00", "") 
newstr2 = newstr.replace("'", "") 

newstr2 это плохое решение это работает для малых только строки

+0

Что-то серьезно не так. '', \ xcc \ x08 \ xe5 \ xa1 \ xa1fc'' не является допустимой строкой UTF-8. Представление UTF-8 ', 塡 fc' будет ', \ xe5 \ xa1 \ xa1fc'. Но вы не получаете ни одну из этих строк из текстового буфера, вы получаете * цитированную * версию первого. Другими словами, строка, которую вы получаете, будет вводиться в Python как '' ', \\ xcc \\ x08 \\ xe5 \\ xa1 \\ xa1fc' "'. Как этот буфер заканчивается в вашем текстовом буфере (и как он когда-либо показывался GTK, как что-либо, кроме '', \ xcc \ x08 \ xe5 \ xa1 \ xa1fc''), это то, что вы должны исследовать. – user4815162342

+0

Другой вопрос: как и почему вы ожидаете, что шифрование 'a' приведет к', 塡 fc'. Это не то, как работает шифрование: шифрование обычно преобразует байты в байты. Чтобы зашифровать данные в Юникоде, вы сначала конвертируете его в байты, затем зашифровываете их. Но эти зашифрованные байты больше не могут рассматриваться как представление данных в формате unicode, они выглядят как мусор для декодера UTF-8 (или другого), который в лучшем случае будет производить [mojibake] (http://en.wikipedia.org/wiki/ Mojibake), когда их кормили. – user4815162342

+0

Я знаю, что я использую pyDes для шифрования 'a', и это результат ', \ xcc \ x08 \ xe5 \ xa1 \ xa1fc', когда у меня есть версия для шифрования в переменной, нет никакой проблемы для ее расшифровки, но когда я использую textbuffer .get_text, чтобы получить мою версию шифрования, это возвращает мне хорошую строку, но в плохом формате, и я не могу ее расшифровать. – Salsores

ответ

1

То, что вы получаете от textbuffer, это строка , указанная в строке, потому что вы цитировали ее перед тем, как положить ее туда.Если вы цитируете строку, прежде чем положить его в TextBuffer:

self.textbuffer.set_text("%r" % k.encrypt(text)) 

, то вам нужно конец цитаты его после извлечения его:

import ast 
text = ast.literal_eval(self.textbuffer.get_text(start, end)) 

Это поможет вам исходную строку, вы положили в

.

Этот проект не будет работать, если пользователь вводит произвольную строку в текстовом представлении, что может легко вызвать исключение, или вызвать присвоение объекту неправильного типа, например номеру или списку, text. Чтобы избежать этого, вы можете избавиться от кавычек при вводе текста в буфер и использовать codecs модуль для выхода в обоих направлениях:

import codecs 
self.text.buffer.set_text(codecs.encode(text, 'string-escape')) 
... 
text = codecs.decode(self.text.buffer.get_text(start, end), 'string-escape') 
+0

Удивительная большая помощь! сожалею, что я не могу проголосовать – Salsores

1

Вы должны лучше использовать новую систему форматирования строк:

>>> cipher_text = ',\xcc\x08\xe5\xa1\xa1fc' 
>>> print cipher_text 
,塡fc 
>>> print "%r" % cipher_text 
',\xcc\x08\xe5\xa1\xa1fc' 
>>> print "{}".format(cipher_text) 
,塡fc 
>>> p = "%r" % cipher_text 
>>> print p 
',\xcc\x08\xe5\xa1\xa1fc' 
>>> p = "{}".format(cipher_text) 
>>> print p 
,塡fc 

похоже, что старый способ форматирования строк имеет серьезные проблемы с unicode и ascii (это то, что я обнаруживаю, когда я пытаюсь это сделать), тогда как новая система форматирования работает как шарм. Кроме того, он готов к python3!

  • редактировать после получения более подробной информации был добавлен вопрос:

AFAICT, GTK не имеет никаких проблем, работающих с юникод строк. Вы должны получить строку unicode из TextBuffer.get_text(). Таким образом, чтобы быть уверенным, что я предполагаю, вы должны сначала сделать:

print type(text) 

, чтобы увидеть, если TextBuffer возвращает str() или unicode() объект.

Затем, вы можете попробовать

text = unicode(self.textbuffer.get_text(start, end) 

или

text = self.textbuffer.get_text(start, end).encode('utf-8') 

или даже

text = '{}'.format(self.textbuffer.get_text(start_end)) 

вещи часто может получить сложно при преобразовании между UTF-8 и ASCII в питона. Есть хорошее руководство по этой теме, и все гораздо менее болезненно, используя python3, который использует unicode по умолчанию. В ссылке на python2 есть большой документ по этой теме: unicode howto.

+0

нормально, но текст = self.textbuffer.get_text (начало, конец) печать текста // '\ XCC \ x08 \ xe5 \ xa1 \ xa1fc' х = «{} ».format (текст) печать х // '\ XCC \ x08 \ xe5 \ xa1 \ xa1fc' , но мне нужно //, 塡 Ь – Salsores

+0

ты говоришь про [gtk.TextBuffer] (HTTP://www.pygtk.org/docs/pygtk/class-gtktextbuffer.html). Вы знаете, что мы не можем читать ваши мысли и догадываться, что такое таинственный «textbuffer», о котором вы говорите, только потому, что вы menti один раз в вашем вопросе ... Если это тот, о котором я думаю, вы должны хотя бы добавить тег gtk на свой вопрос – zmo

+0

извините, попробуйте восстановить мою ошибку – Salsores

Смежные вопросы