2012-02-29 25 views
5

Với một tên tập tin tìm kiếm như:Python open() unicode hành vi filename hệ điều hành trên khác nhau

filename = u"/direc/tories/español.jpg" 

Và sử dụng open() như:

fp = open(filename, "rb") 

này một cách chính xác sẽ mở các tập tin trên OSX (10,7), nhưng trên Ubuntu 11.04 hàm open() sẽ cố mở u"espa\xf1ol.jpg" và điều này sẽ thất bại với IOError. Thông qua quá trình cố sửa lỗi này, tôi đã kiểm tra sys.getfilesystemencoding() trên cả hai hệ thống, cả hai đều được đặt thành utf-8 (mặc dù Ubuntu báo cáo chữ hoa, nghĩa là UTF-8, không chắc chắn nếu điều đó có liên quan). Tôi cũng đã đặt # -*- coding: utf-8 -*- trong tệp python, nhưng tôi chắc chắn điều này chỉ ảnh hưởng đến việc mã hóa bên trong tệp, chứ không phải bất kỳ chức năng bên ngoài nào hoặc cách python xử lý tài nguyên hệ thống. Tệp tồn tại trên cả hai hệ thống với eñe được hiển thị chính xác.

Câu hỏi cuối cùng là: Làm cách nào để mở tệp español.jpg trên hệ thống Ubuntu?

Chỉnh sửa: Chuỗi español.jpg thực sự sắp ra khỏi cơ sở dữ liệu qua ORM của Django (ImageFileField), nhưng khi tôi xử lý nó và thấy sự khác biệt về hành vi, tôi có một chuỗi unicode đường dẫn đến tệp.

+1

Đối với giá trị của nó, '" \ xf1 "' là biểu diễn ISO-8859-1 của '" ñ "'. –

+3

FYI, tôi đã chạm vào một tệp có tên 'español.jpg' và mở nó bằng cách của bạn và nó hoạt động chính xác trên Arch Linux của tôi. Bạn có thể dán đầu ra 'locale' của Ubuntu không? –

+0

'locale' cung cấp' en_US.UTF-8' cho một số tham số bao gồm 'LANG'. – mrmagooey

Trả lời

2

này dưới đây nên làm việc trong cả hai trường hợp:

fp = open(filename.encode(sys.getfilesystemencoding()), "rb") 
+0

'sys.getfilesystemencoding' là một chút dối trá: trên nhiều nền tảng (tôi đang xem bạn, UNIX), hệ thống tệp không có mã hóa, nhưng chỉ là byte. Các ứng dụng - không phải là hệ thống tệp — xác định các mã hóa được sử dụng để đại diện cho tên tệp, nếu tên tệp là văn bản. –

+2

Điều này sẽ không hoạt động trên Windows vì 'getfilesystemencoding' không thực sự báo cáo mã hóa hệ thống tệp (UTF-16). Đừng bao giờ làm điều này nếu bạn muốn có nền tảng độc lập. – Philipp

+1

Nhưng tôi nhận được 'mbcs' trên các cửa sổ bằng cách sử dụng' getfilesystemencoding', xử lý chính xác hệ thống tệp của Windows. –

1

Nó không đủ để chỉ cần đặt mã hóa tập tin ở phía trên cùng của tập tin của bạn. Đảm bảo rằng trình chỉnh sửa của bạn đang sử dụng cùng một mã hóa và lưu văn bản trong mã hóa đó. Nếu cần, hãy nhập lại bất kỳ ký tự không phải ascii nào để đảm bảo rằng trình chỉnh sửa của bạn đang làm đúng.

Nếu giá trị của bạn đến từ ví dụ: một cơ sở dữ liệu, bạn vẫn sẽ cần phải đảm bảo rằng không nơi nào dọc theo dòng đang được mã hóa là không unicode.

+1

+1 cho điều này, vui lòng kiểm tra cài đặt trình chỉnh sửa của bạn. –

+0

Xin lỗi, tôi đã thêm thông tin chỉnh sửa từ đầu mà tôi nghĩ có lẽ nên phủ nhận các vấn đề mã hóa trong trình chỉnh sửa ...? – mrmagooey

+0

@mrmagooey: Có, nhưng lưu ý rằng bạn vẫn cần đảm bảo rằng bạn không mã hóa chuỗi theo cách khác ở đâu đó dọc theo dòng. – Marcin

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