2012-04-23 28 views
8
>>> a = "我" # chinese 
>>> b = unicode(a,"gb2312") 
>>> a.__class__ 
<type 'str'> 
>>> b.__class__ 
<type 'unicode'> # b is unicode 
>>> a 
'\xce\xd2' 
>>> b 
u'\u6211' 

>>> c = u"我" 
>>> c.__class__ 
<type 'unicode'> # c is unicode 
>>> c 
u'\xce\xd2' 

bc đều unicode, nhưng >>> b đầu ra u'\u6211', và kết quả đầu ra >>> cu'\xce\xd2', tại sao?Unicode và 'giải mã() `bằng Python

+0

Bạn đang sử dụng thiết bị đầu cuối nào? Tôi không thể sao chép các kết quả trên thiết bị đầu cuối Unicode gnome của tôi ('c === u '\ u6211'') –

+0

@ChrisMorgan Tôi kiểm tra các mã này trong IDLE. –

+0

cũng có thể repro điều này với IDLE –

Trả lời

12

Khi bạn nhập "我", trình thông dịch Python nhận được từ thiết bị đầu cuối đại diện cho ký tự đó trong bộ ký tự cục bộ của bạn, nó lưu trữ trong chuỗi byte-byte bởi vì "". Trên hệ thống UTF-8 của tôi, đó là . Trên máy của bạn, đó là '\xce\xd2' vì bạn sử dụng GB2312. Điều đó giải thích giá trị của biến số a.

Khi bạn nhập u"我", trình thông dịch Python không biết mã hóa nào là ký tự . Nó giống như chuỗi ký tự thông thường: nó lưu trữ các byte của ký tự trong chuỗi Unicode, giải thích từng byte như một điểm mã Unicode, do đó kết quả sai u'\xce\xd2' (hoặc, trên hộp của tôi, u'\xe6\x88\x91').

Sự cố này chỉ tồn tại trong trình thông dịch tương tác. Khi bạn viết các tập lệnh hoặc mô-đun Python, bạn có thể specify the encoding gần đầu và chuỗi Unicode sẽ xuất hiện ngay. Ví dụ, trên hệ thống của tôi, sau đây sẽ in từ Liberté hai lần:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

print(u"liberté") 
print("liberté") 
0

Các Python chương trình tương tác đại diện của một đối tượng khi bạn chỉ cần gõ trong tên của nó. Mặt khác, lệnh in cố gắng hiển thị ký tự. Biến của bạn có tên là a thuộc loại chuỗi. Trên thực tế, các chuỗi trong Python 2.x là chuỗi byte. Vì vậy, nó phụ thuộc vào môi trường làm việc của bạn. Bạn nói với hàm unicode() mà bây giờ bạn sử dụng mã hóa gb2312. Nếu đúng, thì b chứa thông tin chính xác của ký tự trong mã hóa đã cho.

Cố gắng

>>> print b 

trong trường hợp của bạn. Có thể bạn sẽ thấy kết quả mong muốn. Hãy thử thêm:

>>> print repr(a) 
... 
>>> print repr(b) 

Biểu thị là (nếu có thể) chuỗi văn bản khi sao chép sang mã nguồn sẽ tạo đối tượng có cùng giá trị.

Hãy xem phần "Dive Into Python 3" của Mark Pilgrim, Chương 4. Chuỗi (http://getpython3.com/diveintopython3/strings.html) để có giải thích dễ đọc, dễ đọc.

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