2011-02-25 2 views
0

iTunes URL을 파일 시스템 이름으로 디코딩하려는 PHP에서 예기치 않은 문제가 있습니다. iTunes는 UTF8 호환성을 테스트하기 위해 제작 된 파일 이름에 다음 위치를 제공합니다.Stumped : PHP의 fopen이 5.3.1/WIN에서 16 진수 문자로 실패했습니다.

파일 : // localhost/C :/사용자/사용자/데스크톱/% E6 % 9D % BF % C3 % AD % E9 % 87 % 8E % E5 % 8F % 8B % E7 % BE % 8E % B8 % C3 % B0 % D0 % B9 % C3 % BC % C3 % B6 + % CF % 88 % E6 % BC % A2 % E8 % AA % 9E % E7 % AE % 80 % D8 % B1 % D7 % 91 % D6 % B5의 %의 D6 % BC %의의 D7 %의 99 % D8 %의의 A8의 %의 D9의 %는 8A.mp3

원래 파일 이름은 알파벳과 문자의 혼합이다. 板 í 野 友 美 иðйüö + ψ 漢語 简 ر בֵּי بي MP3

I php의 문자열 형식으로 변환하고 // loaclhost/prefix : $ filename = "C :/Users/user/Desktop/\ xE6 \ x9D \ xBF \ xC3 \ xAD \ xE9 \ x87 \ x8E \ xE5 \ x8F \ x8B \ xE7 \ xBE \ x8E \ xD0 \ xB8 \ xC3 \ xB0 \ xD0 \ xB9 \ xC3 \ xBC \ xC3 \ xB6 + \ xCF \ xA \ xE8 \ xAA \ x9E \ xE7 \ xAE \ x80 \ xD8 \ xB1 \ xD7 \ x91 \ xD6 \ xB5 \ xD6 \ xBC \ xD7 \ x99 \ xD8 \ xA8 \ xD9 \ x8A.mp3 "

fopen 할 때 ($ filename, 'r'); 창문은 파일이 존재하지 않는다고 불평합니다.

Windows의 경우 PHP5.3.1 (XAMPP)입니다.

답변

0

+ (이스케이프 처리되지 않은 경우)은 URL의 공백을 의미합니다. 따라서 Windows는 파일이 공백을 포함하고 있기 때문에 존재하지 않는다는 것을 적절히 나타내며, +이 아닙니다.

URL을 직접 해독하는 대신 PHP에서 제공 한 urldecode()을 사용하는 것이 어떻습니까?

$iTunesURI = 'file://localhost/C:/Users/user/Desktop/%E6%9D%BF%C3%AD%E9%87%8E%E5%8F%8B%E7%BE%8E%D0%B8%C3%B0%D0%B9%C3%BC%C3%B6+%CF%88%E6%BC%A2%E8%AA%9E%E7%AE%80%D8%B1%D7%91%D6%B5%D6%BC%D7%99%D8%A8%D9%8A.mp3'; 
$iTunesPath = ltrim(parse_url($iTunesURI, PHP_URL_PATH), '/'); 

$filename = urldecode($iTunesPath); 
+0

답장을 보내 주셔서 감사 드리며 다른 방법을 사용하여 iTunes URL을 정리하십시오. 불행히도, 이것은 문제가되지 않습니다. 이미 "+"를 16 진수 문자로 대체하고 urldecode 및 rawurldecode를 시도했지만 더 길어진 바이트 길이로 읽을 수있는 합법적 인 파일 이름을 얻는 방법을 찾지 못했습니다 . 나는 php가 XAMPP의이 판에서 바로 컴파일되지 않을지도 모른다는 느낌이 들었다. – Rich

0

내가 테스트 지금 당장에 PHP와 윈도우 상자가없는,하지만 난 당신의 문제는 그 filename encoding in Windows is normally UTF-16 것으로 생각합니다. Undex 리눅스, ext3로 파일 시스템을 사용하여, 당신이 표시된 파일 이름을 생성 한 후 (UTF-8로 인코딩) 다음과 같은 PHP 파일을 작성 :

<?php 
$filename = "板í野友美иðйüö+ψ漢語简رבֵּיبي.mp3"; 
$fh = fopen($filename, 'r'); 
$contents = fread($fh, filesize($filename)); 
print $contents; 
var_dump($filename); 
fclose($fh); 

function encode_filename($fname) { 

    $replaced_filename = 
     preg_replace_callback(
      '/[^\x20-\x7F]/', 
      create_function(
       '$matches', 
       'return "\x" . dechex(ord($matches[0]));' 
      ), 
      $fname 
     ); 
    return $replaced_filename; 

} 

print "Encoded UTF-8 filename: " . encode_filename($filename) . "\n"; 

$filename = mb_convert_encoding($filename, "UTF-8", "UTF-16"); 
print "Encoded UTF-16 filename: " . encode_filename($filename) . "\n"; 

?> 

그것은 성공적으로 내 목표 파일을 읽고 그 내용을 출력. 인코딩 된 파일 이름을

출력했다 : 맞아 보인다 있도록

Encoded UTF-8 filename: \xe6\x9d\xbf\xc3\xad\xe9\x87\x8e\xe5\x8f\x8b\xe7\xbe\x8e\xd0\xb8\xc3\xb0\xd0\xb9\xc3\xbc\xc3\xb6+\xcf\x88\xe6\xbc\xa2\xe8\xaa\x9e\xe7\xae\x80\xd8\xb1\xd7\x91\xd6\xb5\xd6\xbc\xd7\x99\xd8\xa8\xd9\x8a.mp3 
Encoded UTF-16 filename: \xee\x9a\x9d\xeb\xbf\x83\xea\xb7\xa9\xe8\x9e\x8e\xee\x96\x8f\xe8\xaf\xa7\xeb\xba\x8e\xed\x82\xb8\xec\x8e\xb0\xed\x82\xb9\xec\x8e\xbc\xec\x8e\xb6\xe2\xaf\x8f\xe8\xa3\xa6\xeb\xb2\xa2\xee\xa2\xaa\xe9\xbb\xa7\xea\xba\x80\xed\x9e\x91\xed\x9a\xb5\xed\x9a\xbc\xed\x9e\x99\xe2\xb9\xad\xe7\x80\xb3 

이, 당신의 UTF-8 인코딩을 일치합니다. UTF-16 인코딩을 시도하십시오. 또는, 내가 한 것처럼 파일에 직접 파일 이름을 포함시키고 파일을 UTF-16으로 인코딩합니다.

+0

모든 배경 감사합니다. UTF16으로의 업 샘플링이 트릭을하지는 않았지만, 게시 한 기사가 새로운 Windows FS API 용으로 컴파일 된 PHP와 관련이있을 수 있다고 생각합니다.이 단위 테스트는 OSX 및 우분투에서 녹색이므로 뭔가 잘못되었다고 생각합니다. 일단 당신이 멀티 바이트 유니 코드에 들어가면 파일 시스템 통신에서. – Rich