2012-02-01 41 views
5

Nếu tôi có một danh sách các chuỗi unicodeDanh sách chuỗi unicode

lst = [ u"aaa", u"bbb", u"foo", u"bar", ... u"baz", u"zzz" ] 

là nó cần thiết để viết một tiền tố u trước mỗi chuỗi? Tôi có thể thực hiện một công trình nói rằng mọi phần tử của lst sẽ là chuỗi unicode và sau đó viết nó mà không có tiền tố u?

+0

này phụ thuộc vào bạn sử dụng Python 2 hoặc Python 3. –

+0

Tôi đang sử dụng 'Python 2.7.2 +', nhưng nếu bạn biết câu trả lời cho cả nó có thể là hữu ích cho tương lai. – xralf

+0

Trong Python 3.x tất cả các strign là unicode theo mặc định, và bất kỳ kênh xử lý văn bản I/O (tệp, cơ sở dữ liệu, in ấn) hoặc yêu cầu một mã hóa explcit hoặc sử dụng mã hóa hệ thống rộng theo mặc định. – jsbueno

Trả lời

14

Trong Python 2.7 (hay còn Python 2.6), bạn có thể làm cho chữ unicode mặc định cho một mô-đun:

from __future__ import unicode_literals 

Bạn phải bao gồm việc nhập khẩu ở phía trên cùng của tập tin, và sau đó nó áp dụng cho tất cả chuỗi chữ trong tệp. Sử dụng một tiền tố b để buộc dây byte:

>>> from __future__ import unicode_literals 
>>> "sss" 
u'sss' 
>>> b"x" 
'x' 
1

Nếu mục đích của bạn là để chuyển đổi một tập hợp các chuỗi tiêu chuẩn để unicode, bạn có thể lập bản đồ chức năng đó vào danh sách của bạn:

lst = ["aaa", "bbb", "ccc"] 
map(unicode, lst) 

Mà cho

[u"aaa", u"bbb", u"ccc"] 

Nếu Tuy nhiên lst chứa một ASCII không chuỗi ký tự, bạn sẽ phải thêm tiền tố cho chuỗi cụ thể đó với u. Nếu không, bạn sẽ gặp phải lỗi này khi chuyển đổi:

lst = ["\xe4"] 
map(unicode,lst) 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128) 

Như đã lưu ý trong các nhận xét, câu trả lời này khác với Python 2.x hoặc 3.x. Trong Python 3, everything changes:

Mọi thứ bạn nghĩ bạn biết về dữ liệu nhị phân và Unicode đã thay đổi. Python 3.0 sử dụng các khái niệm về dữ liệu văn bản và (nhị phân) thay vì các chuỗi Unicode và các chuỗi 8 bit. Tất cả văn bản là Unicode; tuy nhiên mã hóa Unicode được biểu diễn dưới dạng dữ liệu nhị phân. Loại được sử dụng để giữ văn bản là str, loại được sử dụng để giữ dữ liệu là byte. Sự khác biệt lớn nhất với tình huống 2.x là mọi nỗ lực trộn văn bản và dữ liệu trong Python 3.0 đều làm tăng TypeError, trong khi nếu bạn trộn các chuỗi Unicode và 8 bit trong Python 2.x, nó sẽ hoạt động nếu 8-bit chuỗi xảy ra chỉ chứa các byte 7 bit (ASCII), nhưng bạn sẽ nhận được UnicodeDecodeError nếu nó chứa các giá trị không phải ASCII. Hành vi có giá trị cụ thể này đã gây ra nhiều khuôn mặt buồn trong những năm qua.

+0

Tôi chỉ muốn sử dụng một số tuyên bố tốt hơn để giúp tôi nhập. một cái gì đó như 'lst = u [" aaa "," bbb "," ccc "]' sẽ cho biết rằng mọi chuỗi trong 'lst' là unicode. – xralf

+0

-1 vì không biết về mã hóa unicode và nghĩ rằng "ASCII là OK" - vui lòng đọc http://www.joelonsoftware.com/articles/Unicode.html – jsbueno

+0

@jsbueno - Không có nơi nào tôi nói rằng mặc định là Python 2. x encoding (ASCII) là "OK". Tôi chỉ đơn giản là nói một phương pháp nhanh chóng và bẩn thỉu để chuyển đổi danh sách OP của những gì được coi là mã hóa ASCII chỉ vào biểu diễn unicode với mã hóa ASCII rõ ràng. Có phải anh muốn gì không? Tôi không hoàn toàn chắc chắn vì anh ấy không chỉ định mã hóa anh ấy muốn, vì vậy tôi đã đoán. Để thêm giá trị cho trang web này, nếu bạn cảm thấy rằng một giải thích chi tiết về các mã hóa khác nhau là cần thiết, vui lòng cung cấp nó trong một câu trả lời khác! – Hooked