2008-08-22 63 views
28

Tôi vấp trên đoạn này trong Django tutorial:Unicode vs UTF-8 nhầm lẫn trong Python/Django?

mô hình Django có một str() phương pháp mặc định mà các cuộc gọi unicode() và chuyển kết quả đến một bytestring UTF-8. Điều này có nghĩa là unicode (p) sẽ trả về một chuỗi Unicode, và str (p) sẽ trả về một chuỗi bình thường, với các ký tự được mã hóa dưới dạng UTF-8.

Bây giờ, tôi bị nhầm lẫn vì afaik Unicode không phải là bất kỳ biểu diễn cụ thể nào, vậy chuỗi Unicode là gì trong Python? Điều đó có nghĩa là UCS-2? Googling đã bật lên this "Python Unicode Tutorial" có nội dung rõ ràng là

Unicode là mã hóa hai byte bao gồm tất cả các hệ thống chữ viết thông thường trên thế giới.

sai hoặc sai? Tôi đã bị nhầm lẫn nhiều lần bởi các vấn đề về bộ ký tự và mã hóa, nhưng ở đây tôi khá chắc chắn rằng tài liệu tôi đang đọc bị nhầm lẫn. Có ai biết những gì đang xảy ra trong Python khi nó mang lại cho tôi một "chuỗi Unicode"?

Trả lời

47

"Chuỗi Unicode" trong Python là gì? Điều đó có nghĩa là UCS-2?

Chuỗi Unicode trong Python được lưu trữ nội bộ dưới dạng UCS-2 (biểu diễn 16 bit cố định, gần giống như UTF-16) hoặc UCS-4/UTF-32 (độ dài cố định 32 bit) đại diện). Đó là một lựa chọn biên dịch; trên Windows luôn là UTF-16 trong khi nhiều bản phân phối Linux đặt UTF-32 (‘chế độ rộng’) cho các phiên bản Python của chúng.

Bạn thường không được quan tâm: bạn sẽ thấy các điểm mã Unicode là các phần tử đơn trong chuỗi của bạn và bạn sẽ không biết liệu chúng có được lưu trữ dưới dạng hai hoặc bốn byte hay không. Nếu bạn đang xây dựng UTF-16 và bạn cần xử lý các ký tự bên ngoài Máy chủ đa ngôn ngữ cơ bản, bạn sẽ làm điều đó sai, nhưng điều đó vẫn còn rất hiếm và người dùng thực sự cần thêm ký tự phải biên dịch các bản dựng rộng.

sai hoặc sai?

Có, nó khá sai. Để công bằng tôi nghĩ rằng hướng dẫn là khá cũ; nó có thể là các chuỗi Unicode trước ngày tháng, nếu không phải là Unicode 3.1 (phiên bản giới thiệu các ký tự ngoài Mặt phẳng đa ngôn ngữ cơ bản).

Có một nguồn gây nhầm lẫn bổ sung xuất phát từ thói quen sử dụng thuật ngữ "Unicode" của Windows có nghĩa là, mã hóa UTF-16LE mà NT sử dụng trong nội bộ. Mọi người từ Microsoftland thường có thể sao chép thói quen hơi gây hiểu lầm này.

+1

Xin vui lòng, mọi người, bỏ phiếu câu trả lời này, ngay cả khi lựa chọn "câu trả lời" khác vẫn được chọn. – tzot

+0

[nhún vai] cả hai đều chính xác; đó là hàm ý của ‘len ('ΤΖΩΤΖΙΟΥ') == 8’ thực sự xác định chuỗi Unicode * là gì *, tôi cho là vậy. – bobince

+2

Tôi không đồng ý; Tôi đọc câu hỏi, và nó nói "chuỗi Unicode trong Python là gì". Câu trả lời được chọn có vẻ giống như một mạng lưới các câu ngẫu nhiên, trong khi câu trả lời của bạn dường như còn quan trọng hơn nhiều; tuy nhiên, đây là một vấn đề mà tôi sẽ không tiếp tục theo đuổi. Chúc mừng :) – tzot

0

Cửa hàng Python Unicode dưới dạng UTF-16. str() sẽ trả về biểu diễn UTF-8 của chuỗi UTF-16.

+1

Python lưu trữ chuỗi Unicode dưới dạng UTF-16 hoặc UTF-32, tùy thuộc vào tùy chọn nền tảng và biên dịch. – tzot

+0

Trên nền tảng nào str (unicode_string) trả về UTF-8? Bạn đã thử à? ví dụ. str (u "\ u0369") – tzot

+2

Sai cả hai số. 'str (unicode_val)' sẽ mã hóa theo 'sys.getdefaultencoding()'. – Tobu

-1

Từ Wikipedia on UTF-8:

UTF-8 (8-bit UCS/Unicode Transformation Format) là một mã hóa ký tự chiều dài thay đổi cho Unicode. Nó có thể đại diện cho bất kỳ ký tự nào trong tiêu chuẩn Unicode, nhưng mã hóa ban đầu của mã byte và gán ký tự cho UTF-8 tương thích ngược với ASCII. Vì những lý do này, nó đang dần trở thành mã hóa ưu tiên cho e-mail, trang web [1] và những nơi khác nơi các ký tự được lưu trữ hoặc phát trực tuyến.

Vì vậy, nó ở bất kỳ đâu giữa một đến bốn byte tùy thuộc vào ký tự bạn muốn đại diện trong phạm vi của Unicode.

From Wikipedia on Unicode:

Trong máy tính, Unicode là một tiêu chuẩn công nghiệp cho phép các máy tính để liên tục đại diện và thao tác văn bản thể hiện trong nhất của hệ thống chữ viết của thế giới.

Vì vậy, nó có thể đại diện cho hầu hết (nhưng không phải tất cả) hệ thống chữ viết của thế giới.

Tôi hy vọng điều này sẽ giúp :)

-2

do đó, một "chuỗi Unicode" trong Python là gì?

Python 'biết' rằng chuỗi của bạn là Unicode. Do đó nếu bạn làm regex trên nó, nó sẽ biết đó là nhân vật và đó không phải là vv, đó là thực sự hữu ích. Nếu bạn đã làm một strlen nó cũng sẽ cho kết quả chính xác. Ví dụ nếu bạn đã đếm chuỗi trên Hello, bạn sẽ nhận được 5 (ngay cả khi nó là Unicode). Nhưng nếu bạn đã làm một chuỗi số của một từ nước ngoài và chuỗi đó không phải là một chuỗi Unicode hơn bạn sẽ có kết quả lớn hơn nhiều. Pythong sử dụng thông tin dưới dạng Unicode Character Database để xác định từng ký tự trong chuỗi Unicode.Hy vọng rằng sẽ giúp.

8

Trong khi đó, tôi đã thực hiện một nghiên cứu tinh tế để xác minh nội dung đại diện trong Python là gì và cũng giới hạn của nó là gì. "The Truth About Unicode In Python" là một bài viết rất hay trích dẫn trực tiếp từ các nhà phát triển Python. Rõ ràng, biểu diễn bên trong là UCS-2 hoặc UCS-4 tùy thuộc vào công tắc biên dịch. Vì vậy, Jon, nó không phải là UTF-16, nhưng câu trả lời của bạn đưa tôi đi đúng hướng, cảm ơn.