1

pyDes で char '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対応!

  • 詳細が質問に追加された後に編集します。

事実、gtk は Unicode 文字列の操作に問題はありません。TextBuffer.get_text() からユニコード文字列を取得する必要があります。したがって、私が想定していることを確認するには、最初に次のことを行う必要があります。

print type(text) 

str()TextBuffer がまたはオブジェクトを返すかどうかを確認し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 を使用すると、問題が大幅に軽減されます。このトピックに関する大きなドキュメントが 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 に答える