Được coi là một thực hành tốt để chọn chuỗi Unicode trên chuỗi thông thường khi mã hóa bằng Python? Tôi chủ yếu làm việc trên nền tảng Windows, nơi mà hầu hết các loại chuỗi là Unicode những ngày này (tức là .NET String, '_UNICODE' được bật theo mặc định trên một dự án C++ mới, v.v.). Vì vậy, tôi có xu hướng nghĩ rằng trường hợp các đối tượng chuỗi Unicode không được sử dụng là một loại trường hợp hiếm hoi. Dù sao, tôi tò mò về những gì các học viên Python làm trong các dự án thực tế.Tôi có nên sử dụng chuỗi Unicode theo mặc định không?
Trả lời
Từ thực tế của tôi - sử dụng unicode.
Khi bắt đầu một dự án, chúng tôi đã sử dụng các chuỗi usuall, tuy nhiên dự án của chúng tôi đang phát triển, chúng tôi đã triển khai các tính năng mới và sử dụng thư viện của bên thứ ba mới. Trong mớ hỗn độn với chuỗi không unicode/unicode một số chức năng bắt đầu thất bại. Chúng tôi bắt đầu dành thời gian bản địa hóa vấn đề này và sửa chúng. Tuy nhiên, một số mô-đun bên thứ ba không hỗ trợ unicode và bắt đầu thất bại sau khi chúng tôi chuyển sang nó (nhưng điều này là khá loại trừ hơn một quy tắc).
Ngoài ra tôi có một số kinh nghiệm khi chúng tôi cần viết lại một số mô-đun bên thứ ba (ví dụ: SendKeys) vì chúng không hỗ trợ unicode. Nếu nó được thực hiện trong unicode từ đầu nó sẽ được tốt hơn :)
Vì vậy, tôi nghĩ rằng hôm nay chúng ta nên sử dụng unicode.
P.S. Tất cả những điều lộn xộn đó chỉ là ý kiến ham muốn của tôi :)
Nếu bạn đang xử lý bộ nhớ bị hạn chế hoặc không gian đĩa, hãy sử dụng các chuỗi ASCII. Trong trường hợp này, bạn nên viết thêm phần mềm của bạn trong C hoặc một cái gì đó nhỏ gọn hơn :)
Khi bạn đặt câu hỏi này, tôi cho rằng bạn đang sử dụng Python 2.x.
Python 3.0 thay đổi khá nhiều trong biểu diễn chuỗi và tất cả văn bản bây giờ là unicode.
Tôi sẽ tìm kiếm unicode trong bất kỳ dự án mới nào - theo cách tương thích với chuyển sang Python 3.0 (xem details).
Vâng, khả năng tương thích trong tương lai là khá quan trọng! –
Bổ sung vào nhận xét của Mihails Tôi sẽ nói: Sử dụng Unicode, vì đây là tương lai. Trong Python 3.0, Non-Unicode sẽ biến mất, và như tôi biết, tất cả các "U" -Prefixes sẽ gây rắc rối, vì chúng cũng biến mất.
Nó có thể là khó khăn để luôn sử dụng chuỗi unicode bằng Python 2.x - có thể là vì ai đó vô tình sử dụng tự nhiên hơn str(blah)
nơi họ có nghĩa unicode(blah)
, quên u
tiền tố trên xâu, không tương thích mô-đun của bên thứ ba - bất cứ điều gì. Vì vậy, trong Python 2.x, chỉ sử dụng unicode nếu bạn có, và được chuẩn bị để cung cấp vùng phủ sóng thử nghiệm đơn vị tốt.
Nếu bạn có tùy chọn sử dụng Python 3.x tuy nhiên, bạn không cần quan tâm - chuỗi sẽ là unicode mà không cần thêm nỗ lực nào.
Có, sử dụng unicode.
Một số gợi ý:
Khi làm sản lượng đầu vào trong bất kỳ loại định dạng nhị phân, giải mã trực tiếp sau khi đọc và mã hóa trực tiếp trước khi viết, do đó bạn không bao giờ cần phải trộn chuỗi và unicode. Bởi vì việc trộn có xu hướng dẫn đến UnicodeEncodeDecodeErrors sớm hay muộn.
[Quên về điều này, các giải thích của tôi vừa làm cho nó còn khó hiểu hơn nữa. Nó chỉ là một vấn đề khi chuyển sang Python 3, bạn có thể quan tâm đến nó sau đó.]
Lỗi newbie Python thường gặp với Unicode (không nói bạn là người mới, nhưng điều này có thể được đọc bởi người mới): Đừng nhầm lẫn mã hóa và giải mã. Hãy nhớ rằng, UTF-8 là một mã hóa, vì vậy bạn mã hóa Unicode thành UTF-8 và DEcode từ nó.
Đừng rơi vào sự cám dỗ khi đặt mã hóa mặc định bằng Python (bằng cách setdefaultencoding trong sitecustomize.py hoặc tương tự) thành bất kỳ thứ gì bạn sử dụng nhiều nhất. Đó chỉ là sẽ cung cấp cho bạn các vấn đề nếu bạn cài đặt lại hoặc di chuyển đến một máy tính khác hoặc đột nhiên cần phải sử dụng mã hóa khác. Hãy rõ ràng.
Hãy nhớ rằng, không phải tất cả thư viện chuẩn của Python 2 đều chấp nhận unicode. Nếu bạn nạp một phương thức unicode và nó không hoạt động, nhưng nó nên thử dùng ascii và xem nó. Ví dụ: urllib.urlopen(), không thành công với các lỗi không hữu ích nếu bạn cho nó một đối tượng unicode thay vì một chuỗi.
Hm. Đó là tất cả những gì tôi có thể nghĩ đến bây giờ!
Điểm 3 rất đúng - mọi người tôi biết (kể cả tôi) đều mắc lỗi này, và không chỉ một lần! –
Re: "mã hóa trực tiếp sau khi viết" - bạn có thể làm rõ? Tôi nghĩ rằng nên là "trước" thay vì "sau", nhưng tôi có thể bị mất điểm của bạn. – ars
@Lennart: "Lưu ý rằng ngay cả khi bạn sau khi mã hóa unicode thành một chuỗi đầy đủ của văn bản không ascii, đây vẫn là văn bản, theo Python." ... Trong 3.x, str.encode() trả về các byte kiểu, và sự phân biệt ascii hoặc không có vẻ không liên quan; điểm bạn đang cố gắng tạo ra là gì? –
- 1. Tôi có nên đặt Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture theo mặc định trong ứng dụng của tôi không?
- 2. Chúng tôi có nên chuyển sang sử dụng I/O không đồng bộ theo mặc định không?
- 3. Tôi có nên ghi đè lên ExecutionContext mặc định không?
- 4. Ứng dụng web python của tôi có nên sử dụng unicode cho tất cả các chuỗi không?
- 5. Tôi có nên sử dụng jQuery.each() không?
- 6. Có thể sử dụng Unicode "argv" không?
- 7. Có lý do nào tốt để không sử dụng unicode thay vì chuỗi không?
- 8. Tôi có nên sử dụng ProGuard không?
- 9. Tôi có nên sử dụng HttpRuntime.Cache không?
- 10. Tôi có nên sử dụng tiêu đề Content-Location theo cách này không?
- 11. Tôi có nên sử dụng một khung công tác không?
- 12. Có thể sử dụng (các) khay nhớ tạm của hệ thống theo mặc định không?
- 13. Tôi có nên mặc định môi trường cho ai đó đang sử dụng thư viện của mình không?
- 14. Tôi có nên sử dụng em hoặc px không?
- 15. Độ dài chuỗi Delphi Unicode theo byte
- 16. Tôi có nên sử dụng int hoặc UInt16 không?
- 17. Tôi có nên sử dụng eval() hoặc call_user_func() không?
- 18. Tôi có nên sử dụng ivars trong Objective-C không?
- 19. MutationRecord.oldValue có phải là thứ tôi nên sử dụng không?
- 20. Tôi có nên sử dụng typeclasses hay không?
- 21. Tôi có nên sử dụng quy tắc DELETE CASCADE không?
- 22. Tôi có nên sử dụng Phobos hoặc Tango không?
- 23. Có cách nào để sử dụng thuộc tính JavaScript theo mặc định không?
- 24. Bạn có nên sử dụng strcmp hoặc _tcscmp để so sánh các chuỗi trong phiên bản Unicode không?
- 25. Tại sao NFS sử dụng UDP theo mặc định?
- 26. Tôi có nên sử dụng nguyên mẫu hay không?
- 27. Tôi muốn sử dụng NumPy/SciPy. Tôi có nên sử dụng Python 2 hoặc 3 không?
- 28. Tôi có nên sử dụng đa hình trong javascript không?
- 29. Tôi có nên sử dụng NoSQL thay vì MySQL không?
- 30. Tôi có nên tránh sử dụng Monad không?
+1: luôn sử dụng unicode khi bạn đang xử lý văn bản. Bất cứ khi nào nhu cầu phát sinh để xử lý dữ liệu văn bản dưới dạng byte (ví dụ khi di chuyển qua mạng hoặc ghi vào đĩa) - chuyển đổi unicode thành chuỗi byte (được biểu diễn dưới dạng chuỗi trong Python). Chuyển đổi bằng cách gọi mã hóa hoặc unicode. – codeape