2013-03-13 40 views
6

Trong Python 3, làm cách nào để nội suy chuỗi byte thành chuỗi thông thường và nhận được hành vi tương tự như Python 2 (ví dụ: chỉ lấy mã thoát mà không có tiền tố b hoặc dấu gạch chéo ngược kép)?Python 3: Làm thế nào để có được một chuỗi ký tự bằng chữ của một chuỗi byte?

ví dụ .:

Python 2.7:

>>> x = u'\u041c\u0438\u0440'.encode('utf-8') 
>>> str(x) 
'\xd0\x9c\xd0\xb8\xd1\x80' 
>>> 'x = %s' % x 
'x = \xd0\x9c\xd0\xb8\xd1\x80' 

Python 3.3:

>>> x = u'\u041c\u0438\u0440'.encode('utf-8') 
>>> str(x) 
"b'\\xd0\\x9c\\xd0\\xb8\\xd1\\x80'" 
>>> 'x = %s' % x 
"x = b'\\xd0\\x9c\\xd0\\xb8\\xd1\\x80'" 

Lưu ý cách với Python 3, tôi nhận được tiền tố b ở đầu ra của tôi và dấu gạch đôi. Kết quả mà tôi muốn nhận được là kết quả mà tôi nhận được bằng Python 2.

+0

Trong ví dụ Python 3 của bạn, bạn đang suy thành một chuỗi Unicode, không phải là một chuỗi byte như bạn đang làm trong Python 2. –

Trả lời

4

Trong Python 2 bạn có các loại strunicode. str đại diện cho một chuỗi byte đơn giản trong khi unicode là một chuỗi Unicode.

Đối với Python 3, điều này đã thay đổi: Bây giờ str là là những gì unicode bằng Python 2 và byte là là những gì str bằng Python 2.

Vì vậy, khi bạn làm ("x = %s" % '\u041c\u0438\u0440').encode("utf-8") bạn thực sự có thể bỏ qua các tiền tố u, vì nó là ngầm. Mọi thứ không được chuyển đổi rõ ràng trong python là unicode.

này sẽ mang lại dòng cuối cùng của bạn trong Python 3:

("x = %s" % '\u041c\u0438\u0440').encode("utf-8") 

Bây giờ làm thế nào tôi mã hóa sau kết quả cuối cùng, đó là những gì bạn nên luôn luôn làm: Lấy một đối tượng đến, giải mã nó để unicode (bao giờ bạn làm điều đó) và sau đó, khi thực hiện một đầu ra, mã hóa nó trong mã hóa của sự lựa chọn của bạn. Đừng cố xử lý các chuỗi byte thô. Đó chỉ là hành vi xấu xí và không được chấp nhận.

+0

Đúng, mã hóa sau khi kết quả có vẻ như là một cách tốt hơn để đi. Cảm ơn! –

3

Trong ví dụ Python 3, bạn đang nội suy thành một chuỗi Unicode, không phải chuỗi byte giống như bạn đang làm trong Python 2.

Trong Python 3, bytes không hỗ trợ nội suy (định dạng chuỗi hoặc những gì bạn có).

Hoặc tiếp nhau, hoặc sử dụng Unicode tất cả thông qua và chỉ mã hóa khi bạn đã suy:

b'x = ' + x 

hoặc

'x = {}'.format(x.decode('utf8')).encode('utf8') 

hoặc

x = '\u041c\u0438\u0440' # the u prefix is ignored in Python 3.3 
'x = {}'.format(x).encode('utf8') 
+0

Đúng, mã hóa sau khi kết quả có vẻ như là một cách tốt hơn để đi. Cảm ơn! –

0

Trong Python 2, chuỗi byte và chuỗi thông thường giống nhau nên không có chuyển đổi nào được thực hiện bởi str(). Trong Python 3, một chuỗi luôn luôn là một chuỗi Unicode, do đó, str() của một chuỗi byte thực hiện chuyển đổi.

Bạn có thể làm chuyển đổi của riêng bạn thay vào đó làm những gì bạn muốn:

x2 = ''.join(chr(c) for c in x) 
Các vấn đề liên quan