2009-05-05 7 views
6

Tôi thấy một số khung như Django sử dụng unicode khắp nơi vì vậy có vẻ như nó có thể là một ý tưởng hay.Ứ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?

Mặt khác, nó có vẻ giống như một nỗi đau lớn để có tất cả những 'u' thêm nổi xung quanh ở khắp mọi nơi.

Điều gì sẽ xảy ra nếu tôi không làm điều này?

Có vấn đề gì xảy ra nếu tôi làm điều này không?

Tôi đang sử dụng Giá treo ngay bây giờ làm khuôn khổ của mình.

Trả lời

10

Trong Python 3, tất cả các chuỗi đều là Unicode. Vì vậy, bạn có thể chuẩn bị cho điều này bằng cách sử dụng các chuỗi u'' ở mọi nơi bạn cần và sau đó khi bạn nâng cấp lên Python 3 bằng công cụ 2to3 tất cả các u sẽ biến mất. Và bạn sẽ ở một vị trí tốt hơn bởi vì bạn sẽ đã thử nghiệm mã của bạn với các chuỗi Unicode.

Xem Text Vs. Data Instead Of Unicode Vs. 8-bit để biết thêm thông tin.

19

Bạn có thể tránh được những u'' trong python 2,6 bằng cách thực hiện:

from __future__ import unicode_literals 

Điều đó sẽ làm cho 'string literals' là đối tượng unicode, giống như nó là trong python 3;

+0

Tuyệt vời. Mẹo siêu hữu ích. – baudtack

+0

+1 Quá xấu không thể kết hợp với câu trả lời đã chọn. Cả hai đều là câu trả lời 'tốt nhất' để giải quyết vấn đề này. –

3

Điều gì sẽ xảy ra nếu tôi không làm điều này?

Tôi là người phương Tây sống ở Nhật Bản, vì vậy tôi đã thấy trực tiếp những gì cần thiết để làm việc với các ký tự không phải ASCII. Vấn đề nếu bạn không sử dụng chuỗi Unicode là mã của bạn sẽ là một sự thất vọng đối với các phần của thế giới sử dụng bất cứ thứ gì ngoài A-Z. Công ty chúng tôi đã có rất nhiều thất vọng khi nhận được một số phần mềm web nhất định để làm các ký tự tiếng Nhật mà không gây ra một mớ hỗn độn nào.

Cần một chút nỗ lực cho người nói tiếng Anh để đánh giá cao Unicode tuyệt vời như thế nào, nhưng nó thực sự là một công việc tuyệt vời để làm cho máy tính có thể truy cập được tất cả các nền văn hóa và ngôn ngữ.

"Gotchas":

  1. Đảm bảo trang web đầu ra của bạn ghi rõ mã hóa được sử dụng đúng cách (ví dụ sử dụng tiêu đề nội dung mã hóa), và sau đó mã hóa tất cả các chuỗi Unicode đúng ở đầu ra. Python 3 chuỗi Unicode là một cải tiến tuyệt vời để làm điều này đúng.

  2. Thực hiện mọi thứ bằng chuỗi Unicode và chỉ chuyển đổi sang mã hóa cụ thể vào thời điểm cuối cùng, khi thực hiện đầu ra. Các ngôn ngữ khác, chẳng hạn như PHP, dễ bị lỗi khi thao tác Unicode, ví dụ: Mẫu UTF-8. Giả sử bạn phải cắt ngắn chuỗi Unicode. Nếu nó ở dạng UTF-8 trong nội bộ, có nguy cơ bạn có thể cắt bỏ một ký tự nhiều byte một nửa, dẫn đến kết xuất rác. Việc sử dụng chuỗi Unicode của Python trong nội bộ khiến cho những lỗi này trở nên khó khăn hơn.

+1

Đúng. Nếu bạn định làm * bất kỳ loại thao tác văn bản nào (ví dụ: thay đổi cách viết hoa, cắt từ thành chữ cái), hãy sử dụng các đối tượng unicode của Python hoặc bạn sẽ cảm thấy đau. –

1

Sử dụng Unicode nội bộ là cách hay để tránh các sự cố với ký tự không phải ASCII. Chuyển đổi tại các ranh giới của ứng dụng của bạn (dữ liệu đến unicode, dữ liệu gửi đến UTF-8 hoặc bất kỳ thứ gì). Giá treo có thể thực hiện chuyển đổi cho bạn trong nhiều trường hợp: ví dụ: bộ điều khiển có thể trả về chuỗi unicode một cách an toàn; Các mô hình SQLAlchemy có thể khai báo các cột Unicode.

Về chuỗi ký tự trong mã nguồn của bạn: tiền tố u thường không cần thiết. Bạn có thể trộn một cách an toàn các đối tượng str có chứa ASCII với các đối tượng unicode. Chỉ cần chắc chắn rằng tất cả các chuỗi ký tự chuỗi của bạn là ASCII thuần túy hoặc là u "unicode".