Tiền tố u trong chuỗi Python là gì?


232

Giống như trong:

u'Hello'

Tôi đoán là nó chỉ ra "Unicode", nó có đúng không?

Nếu vậy, kể từ khi nào nó có sẵn?

Câu trả lời:


147

Bạn nói đúng, xem 3.1.3. Chuỗi Unicode .

Đó là cú pháp từ Python 2.0.

Python 3 làm cho chúng trở nên dư thừa, vì kiểu chuỗi mặc định là Unicode. Các phiên bản 3.0 đến 3.2 đã loại bỏ chúng, nhưng chúng đã được thêm lại trong 3.3+ để tương thích với Python 2 để hỗ trợ quá trình chuyển đổi từ 2 đến 3.


6
Bạn nên thêm rằng nó không cần thiết trong Python 3 nữa, nhưng vẫn là cú pháp hợp lệ.
Martin Thoma

Kết hợp chuỗi unicode + raw (regex) (vd ur"string") là hợp lệ trong Python 2, nhưng không may là cú pháp không hợp lệ trong Python 3.
cowlinator

123

Chữ u u'Some String'có nghĩa là chuỗi của bạn là một chuỗi Unicode .

H: Tôi đang rất vội, khủng khiếp và tôi đã đến đây từ Google Tìm kiếm. Tôi đang cố gắng ghi dữ liệu này vào một tệp, tôi đang gặp lỗi và tôi cần giải pháp đơn giản nhất, có lẽ là thiếu sót, thứ hai này.

Trả lời: Bạn thực sự nên đọc bài luận tối thiểu tuyệt đối của mỗi nhà phát triển phần mềm của Joel , Phải tích cực phải biết về Unicode và các bộ ký tự (Không có lý do!) Về các bộ ký tự.

Q: xin vui lòng không có mã thời gian xin vui lòng

A: Tốt thôi. thử str('Some String')hay 'Some String'.encode('ascii', 'ignore'). Nhưng bạn thực sự nên đọc một số câu trả lời và thảo luận về Chuyển đổi chuỗi Unicodeđoạn mồi tuyệt vời, xuất sắc, tuyệt vời này về mã hóa ký tự.


6
Điều này hoạt động nếu chuỗi chỉ chứa văn bản ASCII . Trong tất cả các trường hợp khác, bạn sẽ phải mã hóa rõ ràng.
Martijn Pieters

2
Điều này coi u '' là một cái gì đó "để thoát khỏi". Điều này cho tôi biết rằng bạn không thực sự hiểu nó là gì. Nói chung, bạn không chỉ muốn "loại bỏ" nó và cách chính xác để tạo chuỗi byte từ chuỗi Unicode phụ thuộc vào chuỗi đó chứa gì và trong bối cảnh nào.
Lennart Regebro

2
@LennartRegebro hoàn toàn đồng ý - đây là một câu trả lời vứt đi có nghĩa là tặc lưỡi, nhưng nó đã tích lũy một số lượng upvote khủng khiếp. chỉnh sửa để cố gắng lái mọi người đi đúng hướng.
Andrew

1
Đó là một niềm vui đọc! Cảm ơn! Bài viết đã 17 tuổi và nó vẫn chính xác. Ồ
Kerwin Sneijder

52

Tôi đoán là nó chỉ ra "Unicode", nó có đúng không?

Đúng.

Nếu vậy, kể từ khi nào nó có sẵn?

Con trăn 2.x.

Trong Python 3.x, các chuỗi sử dụng Unicode theo mặc định và không cần utiền tố. Lưu ý: trong Python 3.0-3.2, u là lỗi cú pháp. Trong Python 3.3+, nó trở lại hợp pháp để giúp viết 2/3 ứng dụng tương thích dễ dàng hơn.


4
Thậm chí đó là Lỗi Cú pháp trong Python 3 để sử dụng utiền tố.
Tim Pietzcker 17/03/2016

14
@TimPietzcker: Chỉ trong 3.0-3.2; trong 3,3+ là hợp pháp (và vô nghĩa), để giúp viết các thư viện và ứng dụng đơn mã hóa 2.6 + / 3.3 + dễ dàng hơn.
abarnert

@abarnert: Chà, nhận xét đó bây giờ đã bốn tuổi rưỡi :)
Tim Pietzcker

3
@TimPietzcker: Chắc chắn, nhưng cũng giống như nhận xét của bạn là một phụ lục hữu ích cho bất kỳ ai tìm thấy câu trả lời hữu ích này bằng cách tìm kiếm vào năm 2010, tôi nghĩ sẽ hữu ích khi đề cập đến thay đổi trong 3.3 cho bất kỳ ai tìm thấy nó vào năm 2014. Có thể tốt hơn là nên chỉnh sửa trả lời, nhưng tôi nghĩ đó là một điểm nhỏ mà hầu hết mọi người sẽ không gặp phải (vì trừ khi bạn vẫn đang sử dụng 3.0-3.2 vào năm 2014, "không cần tiền tố" là tất cả những gì bạn cần biết).
abarnert

Nếu bạn đang viết mã cho người dùng tùy ý tải xuống và chạy và muốn bao quát các trường hợp có thể nhất mà không đưa ra các giả định, thật hữu ích khi biết 3.0-3.2 sẽ bị hỏng. Bởi vì bạn cần phải quyết định xem bạn có quan tâm đến việc sử dụng six.text_type()ở mọi nơi cho số người (hy vọng rất nhỏ) vẫn sử dụng 3. [012] - ít nhất là thông tin có sẵn để bạn có thể chọn.
lùn

3

Tôi đến đây vì tôi bị hội chứng buồn cười ở requestsđầu ra. Tôi nghĩ rằng response.textsẽ cung cấp cho tôi một chuỗi được giải mã chính xác, nhưng trong đầu ra, tôi đã tìm thấy các ký tự kép vui nhộn trong đó các ô chữ Đức nên có.

Hóa ra response.encodinglà trống rỗng bằng cách nào đó và vì vậy responsekhông biết làm thế nào để giải mã chính xác nội dung và chỉ coi nó là ASCII (tôi đoán).

Giải pháp của tôi là lấy các byte thô với 'answer.content' và áp dụng thủ công decode('utf_8')cho nó. Kết quả là schöne Umlaute.

Giải mã chính xác

yêu

so với giải mã không đúng

fĂźr


2

Tất cả các chuỗi có nghĩa là cho con người nên sử dụng u "".

Tôi thấy rằng những suy nghĩ sau đây giúp ích rất nhiều khi xử lý các chuỗi Python: Tất cả các chuỗi tệp kê khai Python nên sử dụng u""cú pháp. Các ""cú pháp là cho mảng byte, chỉ.

Trước khi bắt đầu bashing, hãy để tôi giải thích. Hầu hết các chương trình Python bắt đầu với việc sử dụng ""cho chuỗi. Nhưng sau đó, họ cần hỗ trợ tài liệu trên Internet, vì vậy họ bắt đầu sử dụng "".decodevà đột nhiên họ nhận được ngoại lệ ở mọi nơi về việc giải mã cái này và cái kia - tất cả chỉ vì sử dụng ""chuỗi. Trong trường hợp này, Unicode hoạt động như một virus và sẽ tàn phá.

Nhưng, nếu bạn tuân theo quy tắc của tôi, bạn sẽ không bị nhiễm trùng này (vì bạn sẽ bị nhiễm bệnh).


bash -c "echo Shouldn\\'t you use b\\\"...\\\" for byte arrays?"
kennytm

@KennyTM Nghe hay đấy! Đơn giản chỉ có nghĩa là để nói tất cả các chuỗi có nghĩa là cho con người nên sử dụng u"".
Frank Krueger 17/03/2016

1
Nếu bạn muốn sử dụng Unicode một cách tôn giáo ở khắp mọi nơi, trong đó, đối với nhiều ứng dụng (nhưng không phải tất cả), đó là một điều tốt, bạn gần như chắc chắn muốn Python 3.x, chứ không phải 2.x. Điều đó có thể không đúng vào năm 2010 khi điều này được viết, nhưng vào năm 2014, hầu hết các thư viện hoặc nền tảng ngăn bạn nâng cấp lên 3.x cũng sẽ ngăn bạn sử dụng Unicode đúng cách
abarnert

1

Đó là Unicode.

Chỉ cần đặt biến giữa str(), và nó sẽ hoạt động tốt.

Nhưng trong trường hợp bạn có hai danh sách như sau:

a = ['co32','co36']
b = [u'co32',u'co36']

Nếu bạn kiểm tra set(a)==set(b), nó sẽ là Sai, nhưng nếu bạn làm như sau:

b = str(b)
set(a)==set(b)

Bây giờ, kết quả sẽ là Đúng.


Nguy hiểm, nguy hiểm. Bạn không bao giờ nên mã hóa Unicode ( str()hoặc u'€'.encode()) mà không chuyển mã hóa. Nếu chuỗi chứa không phải ASCII, người dùng sẽ nhận được UnicodeEncodeException.
Alastair McCormack

3
Hơn nữa, mã của bạn không hoạt động. b = str(b)chỉ đưa ra chuỗi repr()của danh sách, tức là b = "[u'co32', u'co36']". Sau đóset(a)==set(b) = False
Alastair McCormack
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.