2012-01-10 36 views
5

Sử dụng python 3.2 trong Windows 7 Tôi nhận được sau trong IDLE:UnicodeEncodeError khi sử dụng chức năng biên dịch

>>compile('pass', r'c:\temp\工具\module1.py', 'exec') 
UnicodeEncodeError: 'mbcs' codec can't encode characters in position 0--1: invalid character 

Ai có thể giải thích tại sao báo cáo kết quả biên dịch cố gắng để chuyển đổi tên tập tin unicode sử dụng MBCS? Tôi biết rằng sys.getfilesystemencoding trả về 'mbcs' trong Windows, nhưng tôi nghĩ rằng điều này không được sử dụng khi tên tập tin unicode được cung cấp.

ví dụ:

f = open(r'c:\temp\工具\module1.py') 

công trình.

Đối với một thử nghiệm hoàn chỉnh hơn tiết kiệm như sau trong một file utf8 mã hóa và chạy nó sử dụng phiên bản python.exe tiêu chuẩn 3,2

# -*- coding: utf8 -*- 
fname = r'c:\temp\工具\module1.py' 
# I do have the a file named fname but you can comment out the following two lines 
f = open(fname) 
print('ok') 
cmp = compile('pass', fname, 'exec') 
print(cmp) 

Output:

ok 
Traceback (most recent call last): 
    File "module8.py", line 6, in <module> 
    cmp = compile('pass', fname, 'exec') 
UnicodeEncodeError: 'mbcs' codec can't encode characters in position 0--1: inval 
id character 
+0

đã thử cục bộ trong XP và nhận lại đối tượng mã thích hợp. Đây có phải là chạy từ CLI hoặc là điều này chạy qua một tập tin? – monkut

+0

Tôi sẽ đoán rằng nó không phải là chữ ký cuộc gọi đó là vấn đề, nhưng nội dung của tập tin đó gây ra lỗi unicode. kiểm tra để đảm bảo rằng "module1.py" được mã hóa chính xác, với chữ ký mã hóa được gán. – monkut

+0

@monkut: Trong Python 3.x, bạn không phải lo lắng về việc mã hóa - nếu có các ký tự UTF-8 trong tệp, thì chúng sẽ được hiển thị dưới dạng ký tự UTF-8. – Makoto

Trả lời

5

Từ Python issue 10114, có vẻ như logic là tất cả các tên tập tin được sử dụng bởi Python nên hợp lệ cho nền tảng mà chúng được sử dụng. Nó được mã hóa bằng cách sử dụng mã hóa hệ thống tập tin được sử dụng trong nội bộ C của Python.

Tôi đồng ý rằng có thể không nên ném lỗi trên Windows vì bất kỳ tên tệp Unicode nào hợp lệ. Bạn có thể muốn gửi một báo cáo lỗi với Python cho việc này. Nhưng lưu ý rằng những thay đổi cần thiết có thể không nhỏ, bởi vì bất kỳ mã C nào sử dụng tên tệp đều phải có thứ gì đó để làm nếu nó không thể được mã hóa.

+0

Một câu hỏi liên quan là tại sao trên phiên bản mới nhất của Windows, mã hóa hệ thống tập tin vẫn phải là mbcs. – PyScripter

+0

@PyScripter: Có nên là cái gì khác không? –

+0

Ít nhất phải là UTF-16 trong các phiên bản hiện đại của Windows – PyScripter

1

Dưới đây là một giải pháp mà làm việc cho tôi: Issue 427: UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-6: ordinal not in range (128):

Nếu bạn nhìn các tập tin PyScripter giúp đỡ trong chủ đề "Encoded Python Nguồn Files" (đoạn cuối) nó sẽ cho bạn biết làm thế nào để cấu hình Python để hỗ trợ các mã hóa khác bằng cách sửa đổi tệp site.py. Tệp này là trong thư mục con lib của thư mục cài đặt Python. Tìm mã hóa chức năng và đảm bảo rằng miền địa phương hỗ trợ nhận biết mã hóa chuỗi mặc định được bật. (Xem dưới đây)

def setencoding(): 
    """Set the string encoding used by the Unicode implementation. The 
    default is 'ascii', but if you're willing to experiment, you can 
    change this.""" 
    encoding = "ascii" # Default value set by _PyUnicode_Init() 
    if 0: <<<--- set this to 1 --------------------------------- 
     # Enable to support locale aware default string encodings. 
     import locale 
     loc = locale.getdefaultlocale() 
     if loc[1]: 
      encoding = loc[1] 
    if 0: 
     # Enable to switch off string to Unicode coercion and implicit 
     # Unicode to string conversion. 
     encoding = "undefined" 
    if encoding != "ascii": 
     # On Non-Unicode builds this will raise an AttributeError... 
     sys.setdefaultencoding (encoding) # Needs Python Unicode 
build ! 
0

Tôi nghĩ rằng bạn có thể thử thay đổi "\" trong đường dẫn của tập tin vào "/", giống như

biên dịch ('pass', r'c: \ temp \ 工具 \ module1.py ' 'exec')

biên dịch ('pass', r'c:/temp/工具 /module1.py', 'exec')

tôi đã gặp một vấn đề giống như bạn, tôi đã sử dụng phương pháp này để giải quyết vấn đề. Tôi hy vọng nó có thể làm việc với bạn.

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