2009-07-12 28 views
19

Đượ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

17

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 :)

+2

+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

2

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 :)

13

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).

+0

Vâng, khả năng tương thích trong tương lai là khá quan trọng! –

4

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.

5

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.

13

Có, sử dụng unicode.

Một số gợi ý:

  1. 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.

  2. [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 đó.]

  3. 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ó.

  4. Đừ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.

  5. 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ờ!

+0

Đ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! –

+1

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

+0

@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ì? –

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