2012-12-28 3 views
1

Windows 7에서 로컬 컴퓨터에서 Apache/PHP/MySQL 서버 (xampp)를 실행하고 있습니다. 많은 확장 기능과 함께 MediaWiki-Software를 설치했습니다. 나의 목표는 Wikipedia에서 일부 페이지를 다운로드하여 로컬로 보여주는 것이다. 하나의 큰 문제를 제외하고는 모두 정상적으로 작동합니다.PHP 문자 인코딩 (MediaWiki에서의 번역)

독일어 위키 백과의 이미지 파일에는 파일 이름에 독일어 Umlaute (ä, ö, ü)가 포함되어 있습니다. 아티클이 Umlaute를 사용하여 이름에 링크하기 때문에이 이름을 변경할 수 없습니다.

maintenance/importImages.php 스크립트를 통해 이러한 이미지를 가져 오려고하면 작동하지 않습니다. 코드를 추적하여 이유를 알아 냈습니다.

PHP가 디렉토리에서 파일을 검색하면 ANSI 문자열로 파일 이름을 읽습니다. MediaWiki는 내부적으로 모든 문자열이 utf-8이어야한다고 요구합니다. 따라서 파일 이름에있는 Umlaut는 (존재하지 않는) 유니 코드 문자의 일부로 해석되어 스크립트를 중단시킵니다.

utf8_encode()에 대한 호출을 수동으로 스크립트에 추가하면 이름이 정상적으로 데이터베이스에 올바르게 추가됩니다. 그러나 실제로 "images"디렉토리에 작성된 파일에는 움라우트 대신 두 개의 특수 문자가있는 깨진 이름이 있습니다. 그 이유는 PHP 스크립트가 utf-8 문자열을 파일 시스템 함수 ("copy", ...)로 전송하지만 운영 체제는 ANSI 문자열을 기대하기 때문입니다. 수동으로 각 파일 시스템 호출 전에 utf8_decode()에 대한 호출을 추가 할 수 있지만 그 중 수천 개가 있습니다!

짧은 형태로 다시 말하면 : OS는 ANSI (이것은 Windows에서는 쉽게 변경할 수 없음)에서 작동하며 PHP 서버 내의 MediaWiki 소프트웨어는 utf-8에서 작동합니다 (또한 변경할 수 없음). 그들이 PHP 서버로/밖으로 갈 때마다 파일 이름 문자열을 자동으로 인코딩/디코딩하는 방법이 있습니까?

나는 이미 mb_internal_encoding()mb_http_output()으로 놀고 있었지만 아무런 변화가 없었습니다. MediaWiki는 utf-8 문자열에서만 작동하는 하드 코딩 된 기능을 사용합니다.

+0

어디에서 변경할 수 있습니까? 예 : utf-8 umlaute를 a, o 또는 u 문자로 변경하고 여전히 작동 가능한 해결책을 만들 수 있습니까? –

+0

어쩌면 여기에 대한 대답이 될 수 있습니다 -> http://stackoverflow.com/questions/1089966/utf8-filenames-in-php-and-different-unicode-encodings – Crisp

+0

** 그래, 해결 했어. ** Apache RewriteRule을 사용한 아이디어는 훌륭했습니다. PHP 코드를 변경할 필요가 없습니다. 내가 (단지 움라우트의 경우 :) 내 httpd.conf 파일에 다음 다시 쓰기 규칙을 추가 (? /이 mywiki \/이미지 /.*/ [^ /] *) 한다 RewriteEngine을 한다 RewriteRule ^에 XC3 \ XA4 \ ([^ /] *? \ xC3 \ xA4 [^ /] *) $ $ 1 \ % C3 \ % 83 \ % C2 \ % A4 $ 2 [NE, N] RewriteRule^(/? mywiki \/images /.*/[^ /] *?) \ xC3 \ xA4 ($ 2 \ % C3 \ % 83 \ % C2 \/mywiki/images/*를 가리키는 URL에서 각 'ä'를 '% C3 % 83 % C2 % A4'로 바꾸는 것입니다. 따라서 MediaWiki는 Windows 파일 시스템에서 손상된 이름을 가진 파일에 액세스 할 수 있습니다. – user1934614

답변

1

파일 시스템의 모든 파일의 이름을 바꾸어 데이터베이스 내부의 데이터와 일치하도록해야합니다.

파일 이름에 UTF-8로 인코딩 된 바이너리 시퀀스가 ​​파일 시스템에 도달하면 해당 파일이 검색됩니다.

$fileANSI; // you have this 
$fileUTF8 = ut8_encode($fileANSI); // you do this already 
// insert etc, when MW is ready do: 
rename($fileANSI, $fileUTF8); 

따라서 현재 이름에서 히트 할 때 이진 시퀀스로 각 파일의 이름을 바꿔야합니다.

웹 서버의 경우 웹 서버가 PHP 자체보다 다른 파일 시스템 처리 방법을 사용할 수 있으므로 필요한 HTTP 요청을 처리하기 위해 다시 쓰기 규칙을 도입해야 할 수도 있습니다.

코드 페이지가 사용되는 파일 시스템의 시스템 구성도 확인하십시오. 그것은 다를 수 있습니다.

+0

나는 이미 그것에 대해 생각하고 있었다. MediaWiki 내부에서는이 솔루션으로 모든 것이 잘 보입니다. Windows에서는 파일 이름에 읽을 수없는 문자가 포함되어 있지만 괜찮습니다. 하지만 문제는 여전히 남아 있습니다. MediaWiki는 Umlaute (브라우저가 uft-8을 인식하기 때문에)를 사용하여 특수 문자없이 파일에 대한 링크를 만듭니다. 브라우저는 Umlaut를 사용하여 파일을 찾고 있기 때문에 해당 파일을 찾을 수 없지만 파일 시스템에서는 이상한 기호가있는 파일 만 있습니다. 추가 힌트가 있습니까? – user1934614

+0

그래, 내가 아파치 재 작성 규칙으로 해결할 수 있습니다. 재 작성 규칙을 작성하는 데 경험이 없습니다. utf-8에서 Umlaute를 두 개의 특수 문자로 바꿔 쓸 수있는 재 작성 규칙이 필요한 것입니다. – user1934614

+0

@ user1934614 :이 URL을 포착 한 다음 PHP의 파일 시스템 기능을 위해 작동해야합니다. 그런 다음 'readfile'할 수 있어야합니다. 또는 리다이렉트 형태로 바이너리 시퀀스를 제공해야하지만 디버깅 목적으로 먼저'readfile' 변형을 사용해야합니다. – hakre