2012-01-05 32 views
5

Tôi có tệp nằm trong thư mục, với các ký tự danish trong đó, trên máy tính Windows XP. Tôi sử dụng Strawberry perl và muốn đọc tệp này. Mã sau hoạt động tốt:Cách đọc tệp có tên tệp dài với unicode trong Strawberry perl không sử dụng Win32 :: Unicode :: File?

use Win32::Unicode::File; 
    # Some code left out.... 
    $fname = $mw -> getOpenFile(-filetypes=>$types); 
    my $fh = Win32::Unicode::File->new; 
    $fh->open('<', $fname); 

Thông lệ getOpenFile đến từ Tk. Bây giờ vì một số lý do Win32 :: Unicode :: File có một số tác dụng phụ không may mà tôi không thể sống với (nó ăn bộ nhớ của tôi, xem "Out of memory" with simple Win32::Unicode::File readline loop and Strawberry Perl). Bây giờ nếu tôi cố gắng để mở tập tin mà không có giao diện Win32 :: Unicode :: File tôi nhận được một tập tin không tìm thấy. Lý do cho điều này là con đường được intepreted không chính xác. Tôi đã thử chuyển đổi đường dẫn theo Perl: managing path encodings on Windows không hoạt động vì một số lý do. Làm thế nào tôi nên giải quyết điều này? Tôi đã thử những điều sau đây:

use Encode; 
    # Some code left out.... 
    $fname = $mw -> getOpenFile(-filetypes=>$types); 
    my $fh; 
    open($fh, '<', encode("utf8",$fname,Encode::FB_CROAK)); 

và nó không hoạt động. Bất kỳ ý tưởng?

Hãy tha thứ cho tôi nếu tôi không rõ ràng.

Trân trọng! Michael

+1

Các lựa chọn thay thế: http://p3rl.org/PerlIO::fse http://p3rl.org/Path::Class::Unicode – daxim

+1

methinks bạn nên sử dụng UTF16 làm mã hóa. $ Fname trông như thế nào trong trình gỡ lỗi? –

Trả lời

5
encode("utf8" 

Perl sẽ sử dụng thư viện chức năng tiêu chuẩn C IO để mở tập tin, và trên Windows mà tên tập tin là natively Unicode (UTF-16 đằng sau hậu trường) có nghĩa là thư viện phải giải thích tên tệp trong giao diện định hướng byte như đang ở trong một mã hóa cụ thể.

Đây là vấn đề: mã hóa được chọn không bao giờ là UTF-8 hoặc bất kỳ UTF nào khác. Đó là mã hóa mặc định của miền địa phương, được biết đến (sai) như là trang mã ANSI. Trên cài đặt Windows phía Tây là cp-1252. Nói chung, bạn có thể tìm hiểu nó là gì bằng cách gọi Win32::Codepage::get_encoding. Vì vậy, bằng cách chuyển đổi chuỗi của bạn thành mã hóa đó, bạn có thể truy cập nó bằng cách sử dụng hỗ trợ tệp gốc, miễn là tất cả ký tự trong đường dẫn của tệp nằm trong trang mã ANSI. Đối với Đan Mạch trên một máy phương Tây đó là OK; đối với tiếng Đan Mạch trên máy Trung Quốc, hoặc ngược lại, bạn sẽ luôn gặp lỗi không tìm thấy tệp.

Vì vậy, nếu bạn muốn hỗ trợ tên tệp bằng tất cả ký tự Unicode trong Windows, bạn không có lựa chọn nào khác ngoài sử dụng API Win32 thay vì, Win32::Unicode::File. Đây không phải là duy nhất cho Perl; các ngôn ngữ khác mà không có sự hỗ trợ rõ ràng cho tên tập tin Unicode có chính xác cùng một vấn đề.

+0

Cảm ơn bạn. Câu trả lời chính xác. :) –

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