2013-10-22 8 views
13

को मैं डेटा खोने के बिना ASCII के लिए निम्न यूनिकोड में परिवर्तित करने में असमर्थ हूँ:अजगर - यूनिकोड ASCII रूपांतरण

u'ABRA\xc3O JOS\xc9' 

मैं encode और decode की कोशिश की और वे इसे नहीं करेंगे।

क्या किसी के पास कोई सुझाव है?

+0

क्या आपको वास्तव में ASCII, या बस "कुछ 8-बिट वर्ण सेट" या "मेरे प्लेटफ़ॉर्म के डिफ़ॉल्ट 8-बिट वर्ण सेट" या ऐसा कुछ करने के लिए एन्कोड करने की आवश्यकता है? – abarnert

+0

यह ASCII था। डेटाबेस कनेक्शन ASCII के रूप में सेट किया गया था। –

+1

संदर्भ के लिए, यूनिकोड में स्ट्रिंग _ABRAÃO JOSÉ_ – nealmcb

उत्तर

37

यूनिकोड वर्ण u'\xce0' और u'\xc9' कोई संबंधित ASCII मान नहीं है। इसलिए, यदि आप डेटा खोना नहीं चाहते हैं, तो आपको उस डेटा को किसी भी तरह से एन्कोड करना होगा जो ASCII के रूप में मान्य है। विकल्प शामिल हैं:

>>> print s.encode('ascii', errors='backslashreplace') 
ABRA\xc3O JOS\xc9 
>>> print s.encode('ascii', errors='xmlcharrefreplace') 
ABRAÃO JOSÉ 
>>> print s.encode('unicode-escape') 
ABRA\xc3O JOS\xc9 
>>> print s.encode('punycode') 
ABRAO JOS-jta5e 

इन सभी के ASCII तार कर रहे हैं, और अपने मूल यूनिकोड स्ट्रिंग से जानकारी के सभी शामिल (ताकि वे सभी डेटा की हानि के बिना ही उल्टा हो सकता है), लेकिन उनमें से कोई भी सब हैं कि सुंदर के लिए एक अंतिम उपयोगकर्ता (और उनमें से कोई भी decode('ascii') द्वारा उलट किया जा सकता है)।

str.encode, Python Specific Encodings, और Unicode HOWTO अधिक जानकारी के लिए देखें।


एक तरफ ध्यान दें, जैसा कि जब कुछ लोग कहते हैं "ASCII", वे वास्तव में मतलब यह नहीं है "ASCII" बल्कि "किसी भी 8 बिट वर्ण सेट ASCII का सुपरसेट है कि" या "कुछ विशेष 8- थोड़ा चरित्र सेट जो मुझे दिमाग में है "। तो यह है कि आप क्या मतलब है, समाधान सही 8 बिट वर्ण सेट करने के लिए सांकेतिक शब्दों में बदलना करने के लिए है:

>>> s.encode('utf-8') 
'ABRA\xc3\x83O JOS\xc3\x89' 
>>> s.encode('cp1252') 
'ABRA\xc3O JOS\xc9' 
>>> s.encode('iso-8859-15') 
'ABRA\xc3O JOS\xc9' 

कठिन हिस्सा जानना है जो वर्ण सेट आप का मतलब है। यदि आप दोनों कोड लिख रहे हैं जो 8-बिट स्ट्रिंग्स और कोड का उपभोग करते हैं, और आप किसी भी बेहतर तरीके से नहीं जानते हैं, तो आपका मतलब यूटीएफ -8 था। यदि कोड 8-बिट तारों का उपभोग करता है, तो कहें, open फ़ंक्शन या एक वेब ब्राउज़र जिसे आप किसी पृष्ठ पर या किसी अन्य चीज़ की सेवा कर रहे हैं, चीजें अधिक जटिल हैं, और बहुत अधिक जानकारी के बिना कोई आसान जवाब नहीं है।

+0

बहुत बढ़िया उत्तर की तरह दिखती है। –

+0

धन्यवाद। इससे मदद मिली। मैंने पहले से ही xmlcharrefreplace किया था लेकिन जैसा कि मैं ओरेकल डीबी को लिख रहा था, उसने मेरी स्ट्रिंग में कचरा लगाया। मैंने एनएलएस_एलएएनजी परम को बदलने के मुद्दे को हल किया। 'os.environ [" NLS_LANG "] =" AMERICAN_AMERICA.WE8ISO8859P1 "' और फिर "लैटिन -1" –

+0

@AdrianoAlmeida में कनवर्ट करना: ध्यान दें कि, हालांकि लैटिन -1/आईएसओ -885 9 -1 आपके दोनों मौजूदा पात्रों को संभालता है, यह यूनिकोड के अधिकांश संभाल नहीं करता है। इसलिए, जैसे ही कोई आपको रूसी या चीनी नाम देने की कोशिश करता है, आपको 'यूनिकोड एरर' मिलेगा। यदि आप इसके बजाय यूटीएफ -8 का उपयोग करने के लिए ओरेकल सेट कर सकते हैं, तो आप ऐसी भविष्य की किसी भी समस्या से बचेंगे। यदि आप नहीं कर सकते ... बस इसे ध्यान में रखें, और तदनुसार अपना परीक्षण तैयार करें। जीत के लिए – abarnert

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