2009-04-02 1 views
11

이름에 UTF-8 문자가있는 PHP 파일에 액세스하고 싶습니다.PHP 파일 이름 (또는 전체 경로의 dir)에 UTF-8 문자를 사용할 수 있습니까?

파일에 BOM이 없습니다. 몇 개의 유니 코드 문자를 표시하는 echo 문만 있습니다. 브라우저에서 PHP 페이지에 액세스

(파이어 폭스 3.0.8, IE7)는 HTTP 오류의 결과 (500)

는 아파치 로그에 두 개의 항목 (파일 /입니다 க PHP가있다;. 문자는 க A는 복합 문자 중 하나이며 아래 로그의 \ xe0 \ xae \ x95 문자에 해당) :

[토요일] [오류] [클라이언트 127.0.0.1] PHP 경고 : 알 수 없음 : 실패했습니다. 오픈 스트림 : 0 번 라인의 알 수없는 파일이나 디렉토리가 없습니다.

[오류 04/09 30:25 2009 년] [오류] [클라이언트 127.0.0.1] PHP 치명적인 오류 : 알 수 없음 : 'D : va/ROOT/\ xe 0 \ xae \ x95.php '(include_path ='.; C : \ php5 \ pear ') in Unknown in line 0

파일 및 디렉토리 이름이 영어 인 경우 동일한 페이지가 작동합니다. 동일한 설정에서이 페이지에 대해 SSI를 사용하는 데 문제가 없습니다.

편집이 요인이 될 것 같지 않기 때문에 URL 재 작성에

제거 정보.

mod_rewrite가 제거되면 PHP 파일이 여전히 작동하지 않습니다. 파일 이름이 UTF가 아닌 이름으로 바뀐 경우 작동합니다. 그러나 shtml은 파일 및/또는 경로 이름에 UTF 문자가있는 경우에도 작동합니다.

답변

15

동일한 문제가 발생하여 일부 연구를 수행하고 다음을 결론지었습니다. 이것은 Windows에서 php5를위한 것입니다; 그것은 아마 다른 플랫폼에서도 마찬가지지만 체크하지는 않았습니다.

  1. 모든 PHP 파일 시스템 기능 (DIR, is_dir, is_file, 파일, filemtime, 파일 크기, file_exists 등)에만 적용하고 프로그램에서 설정 한 default_charset에 관계없이, ISO-8859-1에서 파일 이름을 반환하거나 ini 파일.

  2. 파일 이름에 유니 코드 문자가 있으면 dir-> read는 ISO-8859-1 문자가 있으면 ISO-8859-1 문자로 반환하고, 그렇지 않으면 물음표를 대체합니다.

  3. 파일을 참조 할 때. is_file 또는 파일에서 UTF-8 파일 이름을 전달하면 이름에 2 바이트 이상의 문자가 포함되어 있으면 파일을 찾을 수 없습니다. 그러나 ISO-8859-1에서 표현할 수있는 UTF-8 문자를 제공하면 is_file (utf8_decode ($ filename)) 등이 작동합니다.

즉, PHP5는 이름에 멀티 바이트 문자가있는 파일을 전혀 처리 할 수 ​​없습니다.

멀티 바이트 문자가있는 UTF-8 URL이 요청되고 이것이 파일과 직접 일치하는 경우 PHP는 파일을 처리 할 수 ​​없으므로 파일을 열 수 없습니다.

언어로 된 예쁜 URL을 원하면 mod_rewrite를 사용하는 것이 좋습니다.

그러나 사용자가 업로드하고 다운로드 한 파일을 저장하고 검색하는 경우이 문제를 해결해야합니다. 한 가지 방법은 서버에서 임의의 (UTF-8이 아닌) 파일 이름 (예 : 증가 숫자)을 사용하고 데이터베이스 또는 XML 파일 또는 일부 파일의 파일을 색인하는 것입니다. 또 다른 방법은 파일 자체를 BLOB로 저장하는 것입니다. 또 다른 방법은 (아마도 더 쉬운 일이 벌어지고 인덱스가 손상되면 문제가 발생하지 않을 것입니다) 파일 이름을 직접 인코딩하는 것입니다. 좋은 기술은 서버에 저장할 때 들어오는 모든 파일 이름을 urlencode (sic)하는 것입니다 디스크에 저장하고 다운로드 할 MIME 헤더의 파일 이름을 설정하기 전에 urldecode하십시오. 희미하게 비정상적인 문자 (% 제외)는 % nn으로 인코딩되므로 파일 이름, 크로스 플랫폼 지원 및 패턴 일치에서 공백이있는 모든 문제는 대부분 방지됩니다.

+1

디렉터리를 스캔하고 다른 인코딩에있는 경우조차 발견 한 이름을 사용하여 파일을 열 수 PHP를 얻을 수 있습니다합니다. –

+0

철저하게, 감사합니다! – Znarkus

+0

http://stackoverflow.com/questions/1525830/how-do-i-use-filesystem-functions-in-php-using-utf-8-strings -> 여기에서 확인하겠습니다. – Revenant

2

문자 세트가 UTF-8이기 때문에 유니 코드의 모든 상위 문자를 지원한다는 의미는 아닙니다.

유니 코드 지원은 PHP 6에서 제공되는 주요 추가 기능 중 하나이며 PHP 5는 유니 코드 지원이 부족하다는 점을 강조합니다.

PHP 스크립트가 링크를 생성하는 경우, apache가 URL을 직접 해석하여 리디렉션하는 것과는 다른 문제 일 수 있습니다.

6
  • 나는 사실의 PHP 자체 나 미디어 위키에서 유니 코드 페이지 이름을 사용하려했기 때문에 는 유니 코드 URL을 일 (PHP 기반, 또한 위키 백과 실행) 할 수 있습니다 알고 있으며 작업을 수행합니다. 예 : /index.php/Page_name]. 그래서 PHP는 그것을 처리 할 수 ​​있습니다. 그러나 아파치가 소스 파일의 이름이 UTF-8 인 파일을 찾는 것은 문제가 될 수있다.

  • 문자 인코딩에 대한 PHP.ini 설정이 이에 영향을 미치지 않아야합니다. 특정 리소스를 찾은 다음 PHP 파일로 결정되면 PHP를 호출하는 것이 웹 서버의 역할입니다. 웹 서버 및 기본 파일 시스템 자체가 UTF-8 파일 이름을 처리 할 수 ​​있어야 함을 의미합니다.

  • mod_rewrite 규칙없이 작동합니까? 즉, RewriteEngine을 해제 한 상태로 다시 쓰기 엔진을 해제 한 다음 va.in/utf_dir/utf_file.php를 요청하면 어떻게됩니까? 그렇다면 mod_rewrite 설정 문제 일 수도 있고 규칙 문제 일 수도 있습니다.

  • URL의 유니 코드는 구형 브라우저와 같이 주소를 입력 할 때 일부 브라우저에서 제대로 지원되지 않을 수 있습니다. 이전 브라우저는 UTF-8 인코딩 단계를 건너 뛸 수 있습니다.페이지에서 UTF-8로 인코딩 된 링크를 따르는 경우이 기능이 작동하지 않아야합니다.

1

아니요. PHP 파일 이름은 ASCII 형식이어야합니다. 서버 설정 방법은 중요하지 않습니다. PHP5가 처리 할 수 ​​없으므로 PHP 6을 기다릴 수 없습니다. PHP 스크립트에서 utf8_decode를 사용하여 utf-8 filename/url을 처리 할 수 ​​있습니다 . .htaccess와 SQL을 사용하여 많은 문제를 해결할 수 있지만 유니 코드 파일 이름을 실행할 방법은 없습니다.

데이빗 얼의 대답은 정확합니다.

0

복사 쓰기, e.t.c에 "wfio : //"를 사용하십시오. 폴더에 대한

https://github.com/kenjiuno/php-wfio

:

htaccess로 :

php_value auto_prepend_file C:/fix.php

수정.PHP :

$file = $_SERVER['SCRIPT_FILENAME']; 
if (!is_readable($file)) { 
    $file="wfio://".$file; 
       include $file; 
       exit; 
     } 

그러나 더 나은 PHP를 사용하는 리눅스 OS

관련 문제