Tôi chỉ nghĩ rằng tôi đã đề cập đến một cái gì đó ở đây mà tôi đã phải trải qua một thời gian dài thử nghiệm trước khi cuối cùng tôi nhận ra những gì đang xảy ra. Điều này có thể quá rõ ràng với mọi người ở đây đến nỗi họ không bận tâm đến việc đề cập đến nó. Nhưng nó sẽ giúp tôi nếu họ có, vì vậy theo nguyên tắc đó ...!
Lưu ý: Tôi đang sử dụng Jython cụ thể, v 2.7, vì vậy có thể điều này có thể không áp dụng cho CPython ...
NB2: hai dòng đầu tiên của tệp .py của tôi ở đây là:
# -*- coding: utf-8 -*-
from __future__ import print_function
Cơ chế xây dựng chuỗi "%" (AKA "toán tử nội suy") cũng gây ra các vấn đề THÊM ... Nếu mã hóa mặc định của "môi trường" là ASCII và bạn cố gắng làm một cái gì đó như
print( "bonjour, %s" % "fréd" ) # Call this "print A"
Bạn sẽ không gặp khó khăn khi chạy trong Eclipse ... Trong Windows CLI (cửa sổ DOS), bạn sẽ thấy rằng mã hóa là mã trang 850 (HĐH Windows 7 của tôi) hoặc một cái gì đó tương tự, có thể xử lý ít nhất các ký tự có dấu châu Âu, vì vậy nó sẽ làm việc
print( u"bonjour, %s" % "fréd" ) # Call this "print B"
cũng sẽ làm việc
Nếu, OTOH, bạn chuyển trực tiếp đến một tệp từ CLI, mã hóa xuất chuẩn sẽ là Không có, sẽ mặc định là ASCII (dù sao trên hệ điều hành của tôi), sẽ không thể xử lý một trong các bản in ở trên ... (mã hóa đáng sợ lỗi).
Vì vậy, sau đó bạn có thể nghĩ đến việc chuyển hướng thiết bị xuất chuẩn của mình bằng cách sử dụng
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
và thử chạy trong đường ống CLI vào một tệp ... Rất kỳ lạ, in A ở trên sẽ hoạt động ... Nhưng in B ở trên sẽ gây ra lỗi mã hóa! Tuy nhiên, sau đây sẽ hoạt động tốt:
print( u"bonjour, " + "fréd" ) # Call this "print C"
Kết luận mà tôi đã đưa ra (tạm thời) là nếu một chuỗi được chỉ định là chuỗi Unicode sử dụng tiền tố "u" được gửi đến cơ chế% -handling thì nó dường như liên quan đến việc sử dụng mã hóa môi trường mặc định, bất kể cho dù bạn đã thiết lập thiết bị xuất chuẩn để chuyển hướng!
Làm thế nào mọi người đối phó với điều này là một vấn đề của sự lựa chọn. Tôi sẽ hoan nghênh một chuyên gia về Unicode để nói lý do tại sao điều này xảy ra, cho dù tôi đã hiểu sai theo cách nào đó, giải pháp ưa thích nào cho vấn đề này, liệu nó cũng áp dụng cho CPython , cho dù điều đó xảy ra trong Python 3, v.v., v.v.