이 스택 오버플로 게시물과 관련이 있습니다.
glob ()는 Windows에서 멀티 바이트 문자를 가진 파일 이름을 찾을 수 없습니까?
Windows에서 PHP 및 멀티 바이트 문자가있는 파일에 문제가 있습니다. 내 테스트 사례는 다음과 같습니다.
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
Windows에서 PHP를 설치 한 결과는 쉽게 설명 할 수 있습니다. 잘못된 버전의 PHP를 설치했으며 유니 코드 버전의 Win32 API를 사용하도록 컴파일되지 않은 버전을 사용했습니다. 이러한 이유로 PHP에서 사용하는 파일 시스템 호출은 레거시 "ANSI"API를 사용하므로이 버전의 PHP와 연결된 C / C ++ 라이브러리는 먼저 UTF-8로 인코딩 된 PHP 문자열을 로컬 "ANSI"로 변환하려고 시도합니다. 실행 환경에서 선택된 코드 페이지 (명령 줄 창에서 PHP를 시작하기 전에 CHCP 명령 참조)
귀하의 Windows 버전은 아마도이 이상한 일에 대해 책임을지지 않습니다. 실제로, 이것은 올바르게 컴파일되지 않은 사용자의 PHP 버전이며, 레거시 ANSI 버전의 Win32 API를 사용합니다 (커널에서 파일 시스템 지원이 실제로 직접 수행되지 않은 레거시 16 비트 버전의 Windows 95/98과의 호환성을 위해) 유니 코드를 지원하지만 API의 실제 ANSI 버전을 사용하기 전에 내부 변환 계층을 사용하여 유니 코드를 로컬 ANSI 코드 페이지로 변환).
컴파일러 옵션을 사용하여 PHP를 다시 컴파일하여 UNICODE 버전의 Win32 API를 사용하십시오 (현재 기본값이어야하며, 항상 Windows 95 또는 Windows 98이 아닌 서버에 설치된 PHP의 기본값).
이것이 내 문제인지 여부를 확인할 수 없습니다. 나는 사용 phpinfo()
하고 재미있는 것을 찾지 못했지만, 무엇을 찾아야할지 모르겠습니다. 내가 사용하고 XAMPP를 쉽게 설치에, 그래서 확실히 정확하게는 설치 방법을 정말 아니에요.
Windows 7, 64 비트를 사용하고 있으므로 무지를 용서하지만 "Win32"가 여기에 관련되어 있는지 확실하지 않습니다. 현재 버전의 PHP가 위에서 언급 한 구성으로 컴파일되었는지 어떻게 확인할 수 있습니까?
- PHP 버전 : 5.3.8
- 시스템 : Windows NT WES-PC 6.1 빌드 7601 (Windows 7 Home Premium Edition 서비스 팩 1) i586
- 빌드 날짜 : 2011 년 8 월 23 일 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 section).
PHP 설치가 "UNCODE 버전의 Win32 API로 컴파일되었는지"를 어떻게 알 수 있습니까? (그리고 실제로 어떤 의미가 있습니까?)