2015-01-17 8 views
5

मैं इस "vren \ xe2 \ x80 \ x99t" जैसे स्ट्रिंग को सामान्य एन्कोडिंग पर कैसे डीकोड कर सकता हूं।पायथन एन्कोडिंग/डिकोडिंग समस्या

तो यह शब्द वास्तव में नहीं था और "weren \ xe2 \ x80 \ x99t" नहीं था? उदाहरण के लिए:।

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

“Things 
“Things 
Things 

लेकिन मैं वास्तव में "मिल बातें करना चाहते हैं

या:

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 

लेकिन मैं वास्तव में प्राप्त करना चाहते हैं नहीं थे

मैं कैसे करना चाहिए। यह करें?

+1

आप अपने वांछित अनुवाद शब्दकोश प्रदान करना होगा - फैंसी उद्धरण से सादे ASCII वालों के लिए जैसे - और इसे लागू करने के लिए यूनिकोड तारों की '.translate' विधि का उपयोग करें। मुझे नहीं लगता कि एक मानक "इसे कम करना" अनुवाद शब्दकोश है ... –

+0

ठीक है, मैंने अभी एक बनाया है :) – Brana

उत्तर

7

मैं सबसे आम अजीब वर्ण मैप किया गया तो यह काफी ओलिवर डब्ल्यू के आधार पर पूरा जवाब है जवाब।

यह फ़ंक्शन आदर्श माध्यम से नहीं है, लेकिन यह शुरू करने के लिए सबसे अच्छी जगह है। अधिक वर्ण परिभाषाएँ हैं:

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

आपको एक अनुवाद मानचित्र प्रदान करना चाहिए जो यूनिकोड वर्णों को मानचित्र करे अन्य यूनिकोड वर्ण (उत्तरार्द्ध ASCII सीमा के भीतर होना चाहिए, अगर आप फिर से एनकोड करने के लिए यह करना चाहते हैं):

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

मुझे पता है कि मैं यह कर सकता हूं। लेकिन क्या एक तैयार नक्शा है जो इसे स्वचालित रूप से कर सकता है? – Brana

संबंधित मुद्दे