2015-01-17 19 views
5

Làm cách nào để giải mã các chuỗi như chuỗi "weren \ xe2 \ x80 \ x99t" này trở lại chế độ mã hóa thông thường.Các sự cố mã hóa/giải mã Python

Vì vậy, từ này thực sự không phải là "weren \ xe2 \ x80 \ x99t"? Ví dụ:.

print "\xe2\x80\x9cThings" 
string = "\xe2\x80\x9cThings" 
print string.decode('utf-8') 
print string.encode('ascii', 'ignore') 

“Things 
“Things 
Things 

Nhưng tôi thực sự muốn có được" Mọi thứ

hay:

print "weren\xe2\x80\x99t" 
string = "weren\xe2\x80\x99t" 
print string.decode('utf-8') 
print string.encode('ascii', 'ignore') 

weren’t 
weren’t 
werent 

Nhưng tôi thực sự muốn có được không

Làm thế nào nên tôi. làm điều này?

+1

Bạn sẽ cần phải cung cấp từ điển dịch mong muốn của bạn - ví dụ, từ báo giá ưa thích để những ASCII đồng bằng - và sử dụng phương thức chuỗi Unicode của '.translate' để áp dụng nó. Tôi không nghĩ rằng có một tiêu chuẩn "asciify nó xuống" từ điển dịch thuật xung quanh ... –

+0

Vâng, tôi chỉ cần thực hiện một :) – Brana

Trả lời

7

tôi ánh xạ các ký tự lạ phổ biến nhất vì vậy đây là khá nhiều câu trả lời hoàn chỉnh dựa trên Oliver W. câu trả lời.

Chức năng này không có ý nghĩa lý tưởng, nhưng đó là nơi tốt nhất để bắt đầu. Có nhiều ký tự định nghĩa:

http://utf8-chartable.de/unicode-utf8-table.pl?start=8192&number=128&utf8=string
http://www.utf8-chartable.de/unicode-utf8-table.pl?start=128&number=128&names=-&utf8=string-literal

...

def unicodetoascii(text): 

    uni2ascii = { 
      ord('\xe2\x80\x99'.decode('utf-8')): ord("'"), 
      ord('\xe2\x80\x9c'.decode('utf-8')): ord('"'), 
      ord('\xe2\x80\x9d'.decode('utf-8')): ord('"'), 
      ord('\xe2\x80\x9e'.decode('utf-8')): ord('"'), 
      ord('\xe2\x80\x9f'.decode('utf-8')): ord('"'), 
      ord('\xc3\xa9'.decode('utf-8')): ord('e'), 
      ord('\xe2\x80\x9c'.decode('utf-8')): ord('"'), 
      ord('\xe2\x80\x93'.decode('utf-8')): ord('-'), 
      ord('\xe2\x80\x92'.decode('utf-8')): ord('-'), 
      ord('\xe2\x80\x94'.decode('utf-8')): ord('-'), 
      ord('\xe2\x80\x94'.decode('utf-8')): ord('-'), 
      ord('\xe2\x80\x98'.decode('utf-8')): ord("'"), 
      ord('\xe2\x80\x9b'.decode('utf-8')): ord("'"), 

      ord('\xe2\x80\x90'.decode('utf-8')): ord('-'), 
      ord('\xe2\x80\x91'.decode('utf-8')): ord('-'), 

      ord('\xe2\x80\xb2'.decode('utf-8')): ord("'"), 
      ord('\xe2\x80\xb3'.decode('utf-8')): ord("'"), 
      ord('\xe2\x80\xb4'.decode('utf-8')): ord("'"), 
      ord('\xe2\x80\xb5'.decode('utf-8')): ord("'"), 
      ord('\xe2\x80\xb6'.decode('utf-8')): ord("'"), 
      ord('\xe2\x80\xb7'.decode('utf-8')): ord("'"), 

      ord('\xe2\x81\xba'.decode('utf-8')): ord("+"), 
      ord('\xe2\x81\xbb'.decode('utf-8')): ord("-"), 
      ord('\xe2\x81\xbc'.decode('utf-8')): ord("="), 
      ord('\xe2\x81\xbd'.decode('utf-8')): ord("("), 
      ord('\xe2\x81\xbe'.decode('utf-8')): ord(")"), 

          } 
    return text.decode('utf-8').translate(uni2ascii).encode('ascii') 

print unicodetoascii("weren\xe2\x80\x99t") 
1

Bạn nên cung cấp bản đồ dịch thuật bản đồ các ký tự unicode thành các ký tự unicode khác (sau này nên trong phạm vi ASCII nếu bạn muốn re-encode với nó):

uni2ascii = {ord('\xe2\x80\x99'.decode('utf-8')): ord("'")}  
yourstring.decode('utf-8').translate(uni2ascii).encode('ascii') 
print(yourstring) # prints: "weren't" 
+0

Tôi biết rằng tôi có thể làm điều này. Nhưng có một bản đồ đã sẵn sàng có thể thực hiện điều này một cách tự động không? – Brana

Các vấn đề liên quan