1

我用 pyDes 编码一个字符'a',我想解码它

   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 这是一个糟糕的解决方案,它仅适用于小字符串

4

2 回答 2

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() 中获取一个 unicode 字符串。所以要确定我的假设,你应该首先做:

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))

在 python 中转换 utf-8 和 ascii 时,事情往往会变得棘手。关于这个主题有一本很好的手册,使用 python3 的痛苦要少得多,它默认使用 unicode。在 python2 参考中有一个关于该主题的大文档:unicode howto

于 2013-06-08T22:21:18.147 回答
1

你从文本缓冲区得到的是一个带引号的字符串,这是因为你在把它放在那里之前引用了它。如果在将字符串放入文本缓冲区之前引用字符串:

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')
于 2013-06-09T09:07:28.317 回答