2012-08-03 32 views
6

Tôi có kịch bản Python sau:Tại sao không đặt ngôn ngữ sửa lỗi UnicodeError này?

# -*- coding: utf-8 -*- 
import sys, locale 
locale.setlocale(locale.LC_ALL, 'en_US.utf8') 
print '肥皂' # This works 
print u'肥皂' 

Khi chạy kịch bản tôi nhận được:

肥皂 
Traceback (most recent call last): 
    File "../pycli/samples/x.py", line 5, in <module> 
    print u'肥皂' 
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-1: ordinal not in range(256) 

Tuy nhiên, khi tôi đặt một cách rõ ràng các biến môi trường LC_ALL trong vỏ sau đó nó hoạt động

export LC_ALL=en_US.utf8 

Vì vậy, tôi tự hỏi tại sao không setlocale() có tác dụng tương tự?

+0

Bạn đã thử với 'en_US.utf-8' chưa? –

+0

yep tôi đã thử nhưng với kết quả tương tự – trinth

+0

bạn đã cố gắng để .encode ('utf-8') đầu ra của bạn? –

Trả lời

2

Giá trị chỉ được sử dụng để chỉ định bộ ký tự mặc định cho đầu ra khi khởi động phiên dịch. Nói cách khác, bạn đã quá muộn khi kịch bản được thiết lập và chạy.

+0

Trong trường hợp đó, tại sao phương thức tồn tại? Có vẻ như tùy chọn duy nhất của tôi là đặt các biến môi trường theo cách thủ công .. – trinth

1

Unicode giống như ý tưởng khái niệm văn bản chỉ xuất hiện bên trong chương trình của bạn.

Có lợi thế là nó có thể hỗ trợ bất kỳ ký tự nào, nhưng bất lợi là nó không thể xuất ra được và do đó phải được mã hóa thành một số mã hóa có thể được hiển thị.

Vì vậy, bạn muốn một số đầu vào, nó sẽ được mã hóa và bạn sẽ phải giải mã nó, và nếu bạn muốn xuất unicode, bạn phải mã hóa nó.

Nếu bạn không làm điều đó, python sẽ cố gắng và làm điều đó cho bạn (sử dụng ASCII, hoặc những gì có thể được tìm thấy trong env của bạn, như trong trường hợp của bạn), nhưng bạn không nên dựa vào điều này, vì python có thể làm sai (như trong trường hợp của bạn).

Rất vui nhộn, bạn có thể nhận thấy trong trường hợp thiết bị đầu cuối của bạn hỗ trợ utf8, nhưng con trăn đó không nhận ra nó có thể đang sử dụng utf8.

Thats lý do tại sao bạn nên luôn mã hóa đầu ra và giải mã đầu vào (tốt nhất là sử dụng utf8 khi có thể!)

Bạn có thể đạt được điều này bằng cách sử dụng unicode mã hóa phương pháp và phương pháp chuỗi giải mã, đem lại cho họ mã hóa như là đối số.

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