2013-03-24 28 views
6

tôi lấy chủ đề của một email sử dụng module python và nhận chuỗiThay thế = với ' x' và sau đó giải mã trong python

'=D8=B3=D9=84=D8=A7=D9=85_=DA=A9=D8=AC=D8=A7=D8=A6=DB=8C?=' 

Tôi biết các chuỗi được mã hóa trong 'utf-8'. Python có một phương thức được gọi là chuỗi để giải mã các chuỗi như vậy. Nhưng để sử dụng phương pháp tôi cần để thay thế ký hiệu = bằng chuỗi \x. Bằng cách trao đổi thủ công và sau đó in chuỗi giải mã kết quả, tôi nhận được chuỗi سلام_کجائی đó là chính xác những gì tôi muốn. Câu hỏi đặt ra là làm thế nào tôi có thể thực hiện trao đổi tự động? Câu trả lời có vẻ khó hơn việc sử dụng đơn giản các hàm trên các chuỗi như hàm thay thế.

Dưới đây tôi đã mang mã tôi sử dụng sau khi hoạt động thủ công?

r='\xD8\xB3\xD9\x84\xD8\xA7\xD9\x85_\xDA\xA9\xD8\xAC\xD8\xA7\xD8\xA6\xDB\x8C' 
print r.decode('utf-8') 

Tôi sẽ đánh giá cao bất kỳ ý tưởng khả thi nào.

Trả lời

7

Chỉ cần giải mã nó từ quoted-in để có được bytestring utf8 mã hóa:

In [35]: s = '=D8=B3=D9=84=D8=A7=D9=85_=DA=A9=D8=AC=D8=A7=D8=A6=DB=8C?=' 
In [36]: s.decode('quoted-printable') 
Out[36]: '\xd8\xb3\xd9\x84\xd8\xa7\xd9\x85_\xda\xa9\xd8\xac\xd8\xa7\xd8\xa6\xdb\x8c?' 

Sau đó, nếu cần thiết, từ utf-8 để unicode:

In [37]: s.decode('quoted-printable').decode('utf8') 
Out[37]: u'\u0633\u0644\u0627\u0645_\u06a9\u062c\u0627\u0626\u06cc?' 

 

In [39]: print s.decode('quoted-printable') 
سلام_کجائی? 
+0

Huh, tôi đã không nhận ra rằng bạn có thể làm điều đó trực tiếp. – svk

+0

Tôi không nhận được kết quả chỉ bằng cách in s.decode ('có thể in được') trong hệ thống của tôi. Chỉ in chuỗi unicode cho kết quả mong muốn. – alexander

4

Loại mã hóa này được gọi là có thể in được. Có một mô-đun Python để thực hiện mã hóa và giải mã.

Bạn nói đúng rằng đây chỉ là trích dẫn thuần túy của chuỗi nhị phân, vì vậy bạn cần phải áp dụng giải mã UTF-8 sau đó. (Giả sử các chuỗi là trong UTF-8, tất nhiên Nhưng điều đó có vẻ đúng mặc dù tôi không biết ngôn ngữ..)

import quopri 

print quopri.decodestring("'=D8=B3=D9=84=D8=A7=D9=85_=DA=A9=D8=AC=D8=A7=D8=A6=DB=8C?='").decode("utf-8") 
+1

+1. Hoặc chỉ 'r.decode ('được trích dẫn-in') giải mã ('utf-8')' – RichieHindle

+0

Cả hai giải pháp của svk và RichieHindle đều hoạt động hoàn hảo. Mặc dù sau này là thuận tiện hơn. – alexander