Điều này có liên quan đến bài viết Stack Overflow này:
global () không thể tìm thấy tên tệp có ký tự đa nhân trên Windows?
Tôi đang gặp vấn đề với PHP và các tệp có các ký tự đa nhân trên Windows. Đây là trường hợp thử nghiệm của tôi:
print_r(scandir('./uploads/'));
print_r(glob('./uploads/*'));
Đầu ra đúng trên máy chủ UNIX từ xa:
Array
(
[0] => .
[1] => ..
[2] => filename-äöü.jpg
[3] => filename.jpg
[4] => test이test.jpg
[5] => имя файла.jpg
[6] => פילענאַמע.jpg
[7] => 文件名.jpg
)
Array
(
[0] => ./uploads/filename-äöü.jpg
[1] => ./uploads/filename.jpg
[2] => ./uploads/test이test.jpg
[3] => ./uploads/имя файла.jpg
[4] => ./uploads/פילענאַמע.jpg
[5] => ./uploads/文件名.jpg
)
Đầu ra không chính xác cục bộ trên Windows:
Array
(
[0] => .
[1] => ..
[2] => ??? ?????.jpg
[3] => ???.jpg
[4] => ?????????.jpg
[5] => filename-äöü.jpg
[6] => filename.jpg
[7] => test?test.jpg
)
Array
(
[0] => ./uploads/filename-äöü.jpg
[1] => ./uploads/filename.jpg
)
Đây là một đoạn trích có liên quan từ câu trả lời tôi chọn chấp nhận (đây thực sự là một trích dẫn từ một bài báo đã được đăng trực tuyến hơn 2 năm trước):
Từ các bình luận về bài viết này: http://www.rooftopsolutions.nl/blog/filesystem-encoding-and-php
Đầu ra từ cài đặt PHP của bạn trên Windows rất dễ giải thích: bạn đã cài đặt phiên bản PHP sai và sử dụng phiên bản không được biên dịch để sử dụng phiên bản Unicode của API Win32. Vì lý do này, các cuộc gọi hệ thống tệp được PHP sử dụng sẽ sử dụng API "ANSI" cũ và do đó, các thư viện C / C ++ được liên kết với phiên bản PHP này trước tiên sẽ cố gắng chuyển đổi chuỗi PHP được mã hóa UTF-8 thành "ANSI" cục bộ codepage được chọn trong môi trường chạy (xem lệnh CHCP trước khi khởi động PHP từ cửa sổ dòng lệnh)
Phiên bản Windows của bạn CÓ VẤN ĐỀ NHẤT KHÔNG chịu trách nhiệm về điều kỳ lạ này. Trên thực tế, đây là phiên bản PHP của BẠN không được biên dịch chính xác và sử dụng phiên bản ANSI API Win32 kế thừa (để tương thích với các phiên bản Windows 95/98 kế thừa có hỗ trợ hệ thống tệp trong kernel thực sự không có trực tiếp hỗ trợ Unicode, nhưng đã sử dụng lớp chuyển đổi bên trong để chuyển đổi Unicode sang bảng mã ANSI cục bộ trước khi sử dụng phiên bản API ANSI thực tế).
Biên dịch lại PHP bằng tùy chọn trình biên dịch để sử dụng phiên bản UNICODE của API Win32 (ngày nay phải là mặc định và luôn luôn là mặc định cho PHP được cài đặt trên máy chủ KHÔNG BAO GIỜ là Windows 95 hoặc Windows 98 ...)
Tôi không thể xác nhận liệu đây có phải là vấn đề của tôi hay không. Tôi đã sử dụng phpinfo()
và không tìm thấy bất cứ điều gì thú vị, nhưng tôi không chắc chắn những gì cần tìm kiếm. Tôi đã sử dụng XAMPP để cài đặt dễ dàng, vì vậy tôi thực sự không chắc chắn chính xác cách nó được cài đặt.
Tôi đang sử dụng Windows 7, 64 bit - vì vậy hãy tha thứ cho sự thiếu hiểu biết của tôi, nhưng tôi thậm chí không chắc liệu "Win32" có liên quan ở đây không. Làm cách nào để kiểm tra xem phiên bản PHP hiện tại của tôi đã được biên dịch với cấu hình được đề cập ở trên chưa?
- Phiên bản PHP : 5.3.8
- Hệ thống : Windows NT WES-PC 6.1 build 7601 (Gói dịch vụ Windows 7 Home Premium Edition 1) i586
- Ngày xây dựng : 23 tháng 8 năm 2011 11:47:20
- Trình biên dịch : MSVC9 (Visual C ++ 2008)
- Kiến trúc : x86
- Cấu hình lệnh :
cscript /nologo configure.js "--enable-snapshot-build" "--disable-isapi" "--enable-debug-pack" "--disable-isapi" "--without-mssql" "--without-pdo-mssql" "--without-pi3web" "--with-pdo-oci=D:\php-sdk\oracle\instantclient10\sdk,shared" "--with-oci8=D:\php-sdk\oracle\instantclient10\sdk,shared" "--with-oci8-11g=D:\php-sdk\oracle\instantclient11\sdk,shared" "--enable-object-out-dir=../obj/" "--enable-com-dotnet" "--with-mcrypt=static" "--disable-static-analyze"
Trong trường hợp có liên quan hoặc tiết lộ bất kỳ thông tin hữu ích nào, đây là ảnh chụp màn hình của tôi phpinfo()
(phần mb chuỗi ):
Làm cách nào để tìm hiểu xem bản cài đặt PHP của tôi có được "biên dịch với phiên bản UNICODE của Win32 API" không? (và điều đó thực sự có ý nghĩa gì không?)