PHP가 Win32 API의 유니 코드 버전으로 컴파일되었는지 어떻게 확인할 수 있습니까?


10

이 스택 오버플로 게시물과 관련이 있습니다.

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).

phpinfo 스크린 샷

PHP 설치가 "UNCODE 버전의 Win32 API로 컴파일되었는지"를 어떻게 알 수 있습니까? (그리고 실제로 어떤 의미가 있습니까?)


5
웨슬리가 서로를 조심해야하기 때문에 공산당했다.
웨슬리

인코딩과 관련하여 스크립트에서 수행 한 작업이 있습니까? win7-64 설치 에서이 문제의 반대가되었습니다! Php는 umlats와 그 모든 것들과 내가 통신하고 있던 쓰레기 레거시 프로그램을 읽습니다.
Chris K

이 질문에 대해 유감스럽게 생각하며 미안하지만, 내가 기대했던 빠르고 더러운 작업 답변을 얻지 못하여 결국 Windows 에서이 프로젝트 개발을 중단했습니다. PHP 5.4를 로컬에서 곧 (윈도우에) 설치할 예정이므로, 누구든지 받아 들여진 대답을 제안하고 싶다면 모두 귀를 기울이고 있습니다. 그동안 공감하고 감사합니다.
웨슬리 머치

답변:


3

PHP Windows 저장소 에서 oficial 바이너리를 다운로드하여 설치 해야한다고 생각합니다 (설치 경로를 기록하십시오).

그런 다음 기본적으로 제공되는 바이너리 대신 새 바이너리를 사용하도록 아파치를 구성해야합니다. 간단하다:

  • 당신의 찾기 httpd.confWAMP 폴더에있는 파일 (C 같은 : \ WAMP \ 빈 \ 아파치 \ ApacheXXX \의 conf \ httpd.conf 파일을) -이 TrayIcon에 통과하는 것이 가능하다.

  • 자, 이제 일치하는 문자열을 찾았습니다. LoadModule php5_module

  • 이 줄을 php5_modulec : /php/php5apache2_2.dll에있는 새 줄로 바꾸십시오 (설치 경로를 저장했습니다!). 다음과 같은 결과LoadModule php5_module "c:/php/php5apache2_2.dll"

짜잔 wamp 서버를 재설정하고 Windows 용으로 가장 최신 버전의 PHP 빌드로 응용 프로그램을 테스트하십시오.

이것이 귀하의 문제를 해결할지 확실하지 않지만 반드시 실제 방법입니다. PHP 설정에 문제가 있으면이 기사를 읽으십시오 .

행운을 빕니다!


2

PHP가 유니 코드 플래그로 컴파일되었는지 여부는이 질문이 잠시 동안 있었던 것처럼 보이지만 유니 코드 지원에는 영향을 미치지 않지만 주어진 PE 이미지가 유니 코드 버전의 유니 코드 버전에 대해 컴파일되었는지 여부를 결정 해야하는 경우 Windows API에서는 사용 dumpbin된 kernel32.dll 가져 오기를 검사하는 데 사용할 수 있습니다. 이것은 실제로 실용적으로 수행하는 것이 아니지만 조금이라도 진단에 사용할 수 있습니다.

예를 들어, 유니 코드 실행 파일은 다음을 나열 할 수 있습니다.

               4C CreateFileMappingW
               45 CreateDirectoryW
               33 CompareStringW
              12E GetCurrentDirectoryW
               AF ExpandEnvironmentStringsW
              2F0 SetFileAttributesW

유니 코드 문자의 경우 W로 끝나는 함수의 수를 나타냅니다.

ANSI 실행 파일 또는 DLL의 경우 다음에 더 가까운 것을 볼 수 있습니다.

              30A SetCurrentDirectoryA
              15E GetFileAttributesA
              171 GetLastError
               4B CreateDirectoryA
              319 SetFileAttributesA

대부분의 함수가 A로 끝나는 경우 실행 파일이 ANSI 플래그로 컴파일되었을 가능성이 높습니다.


2

다음은 내가 mbstring겪고 있는 문제 를 처리하기 위해 노력한 코드 입니다. 필자는 필요한 출력을 제시 할 때까지 모든 인코딩 및 옵션 조합을 반복했습니다. 나는 이런 종류의 절차가 당신이 찾고있는 답을 찾는 데 도움이 될 것이라고 생각합니다.

필자의 경우와 같이 문서에 의존하지 마십시오 . 결과는 옵션과 인코딩이 생각한 것과 다릅니다. 필자는 테스트에서 사각형,? s 및 A ~와 같은 것을 얻습니다. 내 테스트는 정확히 당신 print_r의 정보였습니다. 필자의 경우 스크립트에서 고객 및 판매 정보를 Quickbooks로 가져와 UTF-8을 처리 할 수 ​​없습니다. (QB 자체는 할 수 없거나 QODBC 운전자는 할 수 없습니다) 물결표, 무덤 및 umlats는 의문의 여지가 없습니다.

setlocale(LC_CTYPE, 'en_US.UTF-8');
$xmlstr=file_get_contents($file);           
// convert character encoding to get rid of accents, etc
// see http://www.php.net/manual/en/function.mb-detect-encoding.php#89915
// note that unlike ASCII//TRANSLIT and ASCII//TRANSLIT//IGNORE do not work
// in windows 7.
$xmlstr=iconv('UTF-8', 'ASCII//IGNORE', $xmlstr);   

위의 링크는 http://www.php.net/manual/en/function.mb-detect-encoding.php#89915 이며 Google에서 귀하를 찾으면 반드시 읽으십시오.


1

PHP가 mbstring 으로 컴파일되었는지 확인하십시오 (또는 모듈을 사용하는 경우 mbstring 모듈이 설치되어 활성화되어 있는지 확인). 해당 확장을 활성화하면 문제가 해결됩니다. 이 페이지 는 작동하기 위해 알아야 할 모든 것을 알려줍니다.


제안 해 주셔서 감사하지만 mbstring이 올바르게 설치되어 있다고 생각합니다. 나는 게시물 끝에 이것에 관한 약간의 정보를 추가했습니다. 나는 "정확하게 컴파일되지 않은 레거시 ANSI 버전의 Win32 API를 사용하는 PHP의 우리의 버전" 기사에서 인용 한 의견에 대해 더 관심 이있다. 이것이 관련이 있는지 아닌지.
웨슬리 머치

PHP의 유니 코드 지원은 PHP가 비즈니스를 수행하는 데 사용하는 API의 유니 코드 지원과 관련이 있다고 생각하지 않습니다. 나는 후자가 전자가 아닌 문제라고 생각합니다. (하지만 문제에 대한 답은 없지만 죄송합니다. 제정신의 언어를 시도한 후 PHP가 얼마나 끔찍한 지에 대해 혐오감을 느끼므로 경험이 많지 않습니다).
gparent
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.