สิ่งนี้เกี่ยวข้องกับการโพสต์ Stack Overflow:
glob () ไม่สามารถค้นหาชื่อไฟล์ที่มีอักขระหลายไบต์บน Windows ได้หรือไม่
ฉันมีปัญหากับ PHP และไฟล์ที่มีอักขระหลายไบต์บน Windows นี่คือกรณีทดสอบของฉัน:
print_r(scandir('./uploads/'));
print_r(glob('./uploads/*'));
แก้ไขเอาต์พุตบนเซิร์ฟเวอร์ UNIX รีโมต:
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
)
เอาต์พุตไม่ถูกต้องแบบโลคัลบน 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
)
นี่คือข้อความที่ตัดตอนมาจากคำตอบที่ฉันเลือกที่จะยอมรับ (ซึ่งจริงๆแล้วเป็นคำพูดจากบทความที่โพสต์ออนไลน์เมื่อ 2 ปีก่อน):
จากความคิดเห็นในบทความนี้: http://www.rooftopsolutions.nl/blog/filesystem-encoding-and-php
ผลลัพธ์จากการติดตั้ง PHP บน Windows อธิบายได้ง่าย: คุณติดตั้ง PHP เวอร์ชันที่ไม่ถูกต้องและใช้เวอร์ชันที่ไม่ได้คอมไพล์เพื่อใช้ Win32 API เวอร์ชัน Unicode ด้วยเหตุผลนี้การเรียกระบบไฟล์ที่ใช้โดย PHP จะใช้ API "ANSI" แบบดั้งเดิมดังนั้นไลบรารี C / C ++ ที่เชื่อมโยงกับ PHP เวอร์ชันนี้จะพยายามแปลงสตริง UTF-8-encoded yout ของคุณเป็น "ANSI" เพจรหัสที่เลือกในสภาพแวดล้อมการทำงาน (ดูคำสั่ง CHCP ก่อนเริ่ม PHP จากหน้าต่างบรรทัดคำสั่ง)
Windows รุ่นของคุณส่วนใหญ่จะไม่รับผิดชอบสิ่งแปลก ๆ นี้ อันที่จริงนี่เป็น PHP เวอร์ชันของคุณซึ่งไม่ได้รวบรวมอย่างถูกต้องและใช้ Win32 API เวอร์ชัน ANSI ดั้งเดิม (สำหรับความเข้ากันได้กับ Windows 95/98 รุ่น 16 บิตที่เก่าซึ่งสนับสนุนระบบไฟล์ในเคอร์เนลจริง ๆ แล้วไม่มีโดยตรง สนับสนุน Unicode แต่ใช้เลเยอร์การแปลงภายในเพื่อแปลง Unicode ไปเป็นเพจรหัส ANSI ในเครื่องก่อนที่จะใช้เวอร์ชัน ANSI จริงของ API)
คอมไพล์ PHP ใหม่โดยใช้ตัวเลือกคอมไพเลอร์เพื่อใช้ Win32 API เวอร์ชัน UNICODE (ซึ่งควรเป็นค่าเริ่มต้นในวันนี้และต่อไปจะเป็นค่าเริ่มต้นสำหรับ PHP ที่ติดตั้งบนเซิร์ฟเวอร์ที่จะไม่เป็น Windows 95 หรือ Windows 98 ... )
ฉันไม่สามารถยืนยันได้ว่านี่เป็นปัญหาของฉันหรือไม่ ฉันใช้phpinfo()
และไม่พบสิ่งที่น่าสนใจ แต่ฉันไม่แน่ใจว่าจะมองหาอะไร ฉันใช้XAMPPเพื่อการติดตั้งง่ายดังนั้นฉันจึงไม่แน่ใจว่าจะติดตั้งอย่างไร
ฉันใช้ Windows 7, 64 บิต - ยกโทษให้ความไม่รู้ของฉัน แต่ฉันไม่แน่ใจว่า "Win32" เกี่ยวข้องกับที่นี่หรือไม่ ฉันจะตรวจสอบได้อย่างไรว่า PHP เวอร์ชั่นปัจจุบันของฉันถูกคอมไพล์ด้วยการกำหนดค่าที่กล่าวถึงข้างต้น?
- เวอร์ชั่น PHP : 5.3.8
- ระบบ : Windows NT WES-PC 6.1 สร้าง 7601 (Windows 7 Home Premium Edition Service Pack 1) i586
- วันที่สร้าง : 23 ส.ค. 2011 11:47:20
- คอมไพเลอร์ : MSVC9 (Visual C ++ 2008)
- สถาปัตยกรรม : x86
- กำหนดค่าคำสั่ง :
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"
ในกรณีที่เกี่ยวข้องหรือเปิดเผยข้อมูลที่เป็นประโยชน์นี่คือภาพหน้าจอของฉันphpinfo()
(ส่วน mbstring):
ฉันจะทราบได้อย่างไรว่าการติดตั้ง PHP ของฉัน "ได้รับการคอมไพล์ด้วย Win32 API เวอร์ชัน UNICODE" หรือไม่ (และนั่นทำให้รู้สึกจริง ๆ ?)