2012-12-23 30 views
59

Đây là một câu hỏi loại Python 101, nhưng nó đã cho tôi bối rối một lúc khi tôi cố gắng sử dụng một gói mà dường như chuyển đổi đầu vào chuỗi của tôi thành byte.Làm thế nào để chuyển đổi giữa các byte và chuỗi trong Python 3?

Như bạn sẽ thấy dưới đây tôi đã tìm thấy câu trả lời cho bản thân mình, nhưng tôi cảm thấy nó đáng ghi lại ở đây vì đã mất thời gian để khai quật những gì đang diễn ra. Nó có vẻ là chung chung với Python 3, vì vậy tôi đã không đề cập đến gói ban đầu tôi đã chơi với; nó dường như không có một lỗi (chỉ là gói đặc biệt đã có một phương pháp .tostring() đó là rõ ràng không sản xuất những gì tôi hiểu như là một chuỗi ...)

chương trình thử nghiệm của tôi đi như thế này:

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) 

sản lượng từ mã này cho phép này:

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' 

Vì vậy, có một nhu cầu để có thể chuyển đổi giữa byte và chuỗi, để tránh kết thúc với ký tự khác aSCII được biến thành gobbledegook.

+1

[Câu hỏi này] (http://stackoverflow.com/questions/7585435/best-way-to-convert-string-to-bytes-in-python-3) đưa ra nhiều chi tiết hơn trong câu trả lời, nhưng tôi nghĩ câu trả lời nhanh hơn sẽ rõ ràng hơn. – Bobble

Trả lời

89

Các 'Mangler' trong mẫu mã trên đã được thực hiện tương đương về điều này:

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

Có nhiều cách khác để viết những dòng này (đặc biệt là sử dụng bytes(stringThing, encoding='UTF-8'), nhưng cú pháp trên làm cho nó rõ ràng những gì đang xảy ra , và cũng có thể làm gì để khôi phục lại chuỗi:.

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

Khi chúng tôi thực hiện điều này, chuỗi gốc bị thu hồi

Lưu ý, sử dụng str(bytesThing) chỉ sao chép tất cả các gobbledegook mà không chuyển đổi nó trở lại thành Unicode, trừ khi bạn yêu cầu cụ thể UTF-8, viz., str(bytesThing, encoding='UTF-8'). Không có lỗi nào được báo cáo nếu mã hóa không được chỉ định.

+0

Nếu bạn nhìn vào các phương thức thực hiện, bạn sẽ thấy 'utf-8' là mã hóa mặc định, do đó bạn có thể bỏ qua nó vì bạn biết rằng mã hóa thực sự là' utf-8', tức là 'stringThing.encode () 'và' bytesThing.decode() 'sẽ làm tốt. – ccpizza

+0

@ccpizza Làm cho mã hóa rõ ràng trong các ví dụ trên làm cho nó rõ ràng hơn những gì đang xảy ra, và IMHO là thực hành tốt. Không phải tất cả unicode đều là UTF-8. Nó cũng tránh được sự thất bại thầm lặng được đề cập trong đoạn cuối. – Bobble

+0

hoàn toàn đồng ý; rõ ràng là tốt hơn là ngầm, nhưng imo nó là tốt để biết những gì ** là ** ngầm định. Việc sử dụng nó hay không là một câu hỏi khác. Chỉ vì bạn không có nghĩa là bạn nên :) – ccpizza

11

Trong python3, có phương thức bytes() có cùng định dạng với encode().

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

Tôi không đọc bất cứ điều gì về điều này trong tài liệu, nhưng có lẽ tôi đã không tìm đúng nơi. Bằng cách này, bạn có thể biến chuỗi thành các luồng byte một cách rõ ràng và có thể đọc rõ ràng hơn so với sử dụng encodedecode và không cần phải prefex b trước dấu ngoặc kép.

1

TRY NÀY:

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

TO TEST LOẠI:

print(type(StringVariable)) 

Dưới đây StringVariable 'biểu diễn dưới dạng một chuỗi. 'ByteVariable' đại diện như Byte. Không liên quan đến các Biến câu hỏi ..

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