2012-12-23 33 views
59

यह एक पायथन 101 प्रकार का प्रश्न है, लेकिन यह मुझे थोड़ी देर के लिए परेशान कर रहा था जब मैंने एक पैकेज का उपयोग करने की कोशिश की जो मेरे स्ट्रिंग इनपुट को बाइट्स में परिवर्तित करना प्रतीत होता था।पायथन 3 में बाइट्स और स्ट्रिंग्स के बीच कैसे परिवर्तित करें?

जैसा कि आप नीचे देखेंगे, मुझे अपने लिए जवाब मिला, लेकिन मुझे लगा कि यह रिकॉर्डिंग के लायक था क्योंकि मुझे यह पता लगाने के लिए कि क्या चल रहा था। ऐसा लगता है कि यह पाइथन 3 के लिए सामान्य है, इसलिए मैंने उस मूल पैकेज को संदर्भित नहीं किया है जिसके साथ मैं खेल रहा था;

import mangler         # spoof package 

stringThing = """ 
<Doc> 
    <Greeting>Hello World</Greeting> 
    <Greeting>你好</Greeting> 
</Doc> 
""" 

# print out the input 
print('This is the string input:') 
print(stringThing) 

# now make the string into bytes 
bytesThing = mangler.tostring(stringThing) # pseudo-code again 

# now print it out 
print('\nThis is the bytes output:') 
print(bytesThing) 
: यह एक त्रुटि होने के लिए (था सिर्फ इतना है कि विशेष पैकेज एक .tostring() विधि है कि स्पष्ट रूप से नहीं था उत्पादन क्या मैं एक स्ट्रिंग के रूप में समझा ...)

मेरे परीक्षण कार्यक्रम इस प्रकार है प्रतीत नहीं होता

इस कोड से उत्पादन इस देता है:

This is the string input: 

<Doc> 
    <Greeting>Hello World</Greeting> 
    <Greeting>你好</Greeting> 
</Doc> 


This is the bytes output: 
b'\n<Doc>\n <Greeting>Hello World</Greeting>\n <Greeting>\xe4\xbd\xa0\xe5\xa5\xbd</Greeting>\n</Doc>\n' 

इसलिए, बाइट्स और तार के बीच परिवर्तित करने के लिए, गैर- ASCII वर्ण gobbledegook में दिया जा रहा है के साथ समाप्त से बचने के लिए सक्षम होने के लिए एक की जरूरत है।

+1

[यह प्रश्न] (http://stackoverflow.com/questions/7585435/best-way-to-convert-string-to-bytes-in-python-3) उत्तर में अधिक जानकारी देता है, लेकिन मुझे लगता है कि नीचे दिए गए संक्षिप्त उत्तर अधिक स्पष्ट हैं। – Bobble

उत्तर

89

ऊपर कोड नमूने में 'mangler' इस के बराबर कर रहा था:

bytesThing = stringThing.encode(encoding='UTF-8') 

अन्य तरीके इस लिखने के लिए कर रहे हैं (विशेष रूप से bytes(stringThing, encoding='UTF-8') का उपयोग कर, लेकिन इसके बाद के संस्करण वाक्य रचना यह स्पष्ट क्या चल रहा है बनाता है

newStringThing = bytesThing.decode(encoding='UTF-8') 

जब हम ऐसा करते हैं, मूल स्ट्रिंग वसूल किया जाता है,का उपयोग कर

नोट:, और भी स्ट्रिंग ठीक करने के लिए क्या करना है।बस सभी गोबब्लेडेग को बिना यूनिकोड में परिवर्तित किए बिना ट्रांसक्रिप्ट करता है, जब तक कि आप विशेष रूप से यूटीएफ -8 का अनुरोध नहीं करते हैं, जैसे str(bytesThing, encoding='UTF-8')। एन्कोडिंग निर्दिष्ट नहीं है अगर कोई त्रुटि रिपोर्ट नहीं है।

+0

यदि आप वास्तविक विधि कार्यान्वयन को देखते हैं तो आप देखेंगे कि 'utf-8' डिफ़ॉल्ट एन्कोडिंग है, इसलिए आप इसे छोड़ सकते हैं कि आप जानते हैं कि एन्कोडिंग वास्तव में' utf-8' है, यानी 'stringThing.encode () 'और' बाइट्सिंग डिकोड() 'ठीक है। – ccpizza

+0

@ccpizza उपर्युक्त उदाहरणों में स्पष्ट एन्कोडिंग बनाना यह सुनिश्चित करता है कि क्या हो रहा है, और आईएमएचओ अच्छा अभ्यास है। सभी यूनिकोड यूटीएफ -8 नहीं है। यह अंतिम पैराग्राफ में उल्लिखित मौन विफलता से भी बचाता है। – Bobble

+0

पूरी तरह से सहमत हैं; स्पष्ट रूप से स्पष्ट है, लेकिन यह जानना अच्छा है कि ** ** ** क्या है। इसका उपयोग करना है या नहीं, एक और सवाल है। सिर्फ इसलिए कि आप इसका मतलब यह नहीं कर सकते कि आपको चाहिए :) – ccpizza

11

पायथन 3 में, bytes() विधि है जो encode() के समान प्रारूप में है।

str1 = b'hello world' 
str2 = bytes("hello world", encoding="UTF-8") 
print(str1 == str2) # Returns True 

मैंने दस्तावेज़ों में इसके बारे में कुछ भी नहीं पढ़ा, लेकिन शायद मैं सही जगह पर नहीं देख रहा था। इस तरह आप तारों को स्पष्ट रूप से बाइट स्ट्रीम में बदल सकते हैं और encode और decode का उपयोग करने और उद्धरण के सामने b का प्रीफ़ेक्स किए बिना इसे और अधिक पठनीय बना सकते हैं।

1

आज़माएं:

StringVariable=ByteVariable.decode('UTF-8','ignore') 

प्रकार का परीक्षण करने के:

print(type(StringVariable)) 

यहाँ 'StringVariable' एक स्ट्रिंग के रूप में प्रतिनिधित्व। 'बाइटवायरबल' बाइट के रूप में प्रतिनिधित्व करता है। यह वैरिएबल पर सवाल नहीं है ..