PHP

2010-06-01 8 views
14

में गैर-अंग्रेज़ी फ़ाइल नामों पर पुनरावृत्ति कैसे करें मेरे पास एक निर्देशिका है जिसमें कई फ़ाइलें हैं, जिनमें से कई गैर-अंग्रेजी नाम हैं। मैं विंडोज 7 में PHP का उपयोग कर रहा हूं।PHP

मैं PHP का उपयोग कर फ़ाइल नाम और उनकी सामग्री सूचीबद्ध करना चाहता हूं।

वर्तमान में मैं DirectoryIterator और file_get_contents का उपयोग कर रहा हूं। यह अंग्रेजी फाइलों के नामों के लिए काम करता है लेकिन गैर-अंग्रेजी (चीनी) फ़ाइल नामों के लिए नहीं।

उदाहरण के लिए, मेरे पास "एक और प्रोबलेम। Eml", "हैलो 鶨 鶖 鵨 鶣 鎹 鎣 .eml" जैसे फ़ाइल नाम हैं।

  1. DirectoryIterator फ़ाइल नाम ->getFilename()
  2. file_get_contents का उपयोग कर प्राप्त करने में सक्षम नहीं है भी खोलने के लिए सक्षम नहीं है, भले ही मैं मुश्किल कोड अपने पैरामीटर में फ़ाइल नाम।

मैं यह कैसे कर सकता हूं?

$content = scandir($directory); 
$list = "<select size = 5 name ='file' id='file'>\n"; 
for($i = 0; $i < count ($content); $i ++) { 
    $list .= "<option>$content[$i] </option>\n"; 
} 
$list .= "</select>\n"; 

यह सफलतापूर्वक फ़ाइल मिलेगा:

+0

यह प्रश्न उत्तर के रूप में टैग करने के योग्य है। Artefacto सटीक जानकारी प्रदान करने के लिए महान प्रयास किया। –

+0

हां। एक महान जवाब है। – Sabya

उत्तर

4

यह संभव नहीं है। यह PHP की एक सीमा है। PHP विंडोज एपीआई के मल्टीबाइट संस्करणों का उपयोग करता है; आप उन वर्णों तक सीमित हैं जो आपके कोडपृष्ठ का प्रतिनिधित्व कर सकते हैं।

this answer देखें।

निर्देशिका सामग्री:

 
D:\Users\Cataphract\Desktop\teste2>dir 
Volume in drive D is GRANDEDISCO 
Volume Serial Number is 945F-DB89 

Directory of D:\Users\Cataphract\Desktop\teste2 

01-06-2010 17:16    . 
01-06-2010 17:16    .. 
01-06-2010 17:15     0 coptic small letter shima follows ϭ.txt 
01-06-2010 17:18    86 teste.php 
       2 File(s)    86 bytes 
       2 Dir(s) 12.178.505.728 bytes free 

टेस्ट फ़ाइल सामग्री:

<?php 
exec('pause'); 
foreach (new DirectoryIterator(".") as $v) { 
    echo $v."\n"; 
} 

टेस्ट फ़ाइल परिणाम:

 
. 
.. 
coptic small letter shima follows ?.txt 
teste.php 

डीबगर उत्पादन:

कॉल स्टैक (पीएचपी 5.3.0):

 
> php5ts_debug.dll!readdir_r(DIR * dp=0x02f94068, dirent * entry=0x00a7e7cc, dirent * * result=0x00a7e7c0) Line 80 C 
    php5ts_debug.dll!php_plain_files_dirstream_read(_php_stream * stream=0x02b94280, char * buf=0x02b9437c, unsigned int count=260, void * * * tsrm_ls=0x028a15c0) Line 820 + 0x17 bytes C 
    php5ts_debug.dll!_php_stream_read(_php_stream * stream=0x02b94280, char * buf=0x02b9437c, unsigned int size=260, void * * * tsrm_ls=0x028a15c0) Line 603 + 0x1c bytes C 
    php5ts_debug.dll!_php_stream_readdir(_php_stream * dirstream=0x02b94280, _php_stream_dirent * ent=0x02b9437c, void * * * tsrm_ls=0x028a15c0) Line 1806 + 0x16 bytes C 
    php5ts_debug.dll!spl_filesystem_dir_read(_spl_filesystem_object * intern=0x02b94340, void * * * tsrm_ls=0x028a15c0) Line 199 + 0x20 bytes C 
    php5ts_debug.dll!spl_filesystem_dir_open(_spl_filesystem_object * intern=0x02b94340, char * path=0x02b957f0, void * * * tsrm_ls=0x028a15c0) Line 238 + 0xd bytes C 
    php5ts_debug.dll!spl_filesystem_object_construct(int ht=1, _zval_struct * return_value=0x02b91f88, _zval_struct * * return_value_ptr=0x00000000, _zval_struct * this_ptr=0x02b92028, int return_value_used=0, void * * * tsrm_ls=0x028a15c0, long ctor_flags=0) Line 645 + 0x11 bytes C 
    php5ts_debug.dll!zim_spl_DirectoryIterator___construct(int ht=1, _zval_struct * return_value=0x02b91f88, _zval_struct * * return_value_ptr=0x00000000, _zval_struct * this_ptr=0x02b92028, int return_value_used=0, void * * * tsrm_ls=0x028a15c0) Line 658 + 0x1f bytes C 
    php5ts_debug.dll!zend_do_fcall_common_helper_SPEC(_zend_execute_data * execute_data=0x02bc0098, void * * * tsrm_ls=0x028a15c0) Line 313 + 0x78 bytes C 
    php5ts_debug.dll!ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER(_zend_execute_data * execute_data=0x02bc0098, void * * * tsrm_ls=0x028a15c0) Line 423 C 
    php5ts_debug.dll!execute(_zend_op_array * op_array=0x02b93888, void * * * tsrm_ls=0x028a15c0) Line 104 + 0x11 bytes C 
    php5ts_debug.dll!zend_execute_scripts(int type=8, void * * * tsrm_ls=0x028a15c0, _zval_struct * * retval=0x00000000, int file_count=3, ...) Line 1188 + 0x21 bytes C 
    php5ts_debug.dll!php_execute_script(_zend_file_handle * primary_file=0x00a7fad4, void * * * tsrm_ls=0x028a15c0) Line 2196 + 0x1b bytes C 
    php.exe!main(int argc=2, char * * argv=0x028a14c0) Line 1188 + 0x13 bytes C 
    php.exe!__tmainCRTStartup() Line 555 + 0x19 bytes C 
    php.exe!mainCRTStartup() Line 371 C 

क्या यह वास्तव में एक प्रश्न चिह्न है?

 
dp->fileinfo 
{dwFileAttributes=32 ftCreationTime={...} ftLastAccessTime={...} ...} 
    dwFileAttributes: 32 
    ftCreationTime: {dwLowDateTime=2784934701 dwHighDateTime=30081445 } 
    ftLastAccessTime: {dwLowDateTime=2784934701 dwHighDateTime=30081445 } 
    ftLastWriteTime: {dwLowDateTime=2784934701 dwHighDateTime=30081445 } 
    nFileSizeHigh: 0 
    nFileSizeLow: 0 
    dwReserved0: 3435973836 
    dwReserved1: 3435973836 
    cFileName: 0x02f9409c "coptic small letter shima follows ?.txt" 
    cAlternateFileName: 0x02f941a0 "COPTIC~1.TXT" 
dp->fileinfo.cFileName[34] 
63 '?' 

हाँ! यह चरित्र # 63 है।

+0

क्या वह सिर्फ एक बाइट्स के रूप में नाम पढ़ और लिख नहीं सकता? –

+0

@ अलवारो जी। विकारियो वह कर सकता था, लेकिन उसके पास उचित नाम नहीं होंगे। एनटीएफएस उचित यूसीएस -2 फ़ाइल नामों का समर्थन करता है, जो आप वर्णन कर रहे हैं वह एक हैक है। – Artefacto

+0

आपकी व्याख्या बेहतर नहीं हो सकती है। मैंने आज बहुत कुछ सीखा है :) –

0

मैं इस स्क्रिप्ट है फ़ाइलों की खोज करते हैं 鶨 鶖 鵨 鶣 鎹 鎣 मैं इसे यहाँ एक Linux distro हालांकि पर की कोशिश की ..

को इसे पढ़ने के आप का उपयोग करें: लाइन द्वारा पंक्ति:

$lines = file('file.txt'); 
//loop through our array, show HTML source as HTML source; and line numbers too. 
foreach ($lines as $line_num => $line) { 
print "Line #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br />\n";//or try it without the htmlspecialchars 
} 
+0

हां, समस्या विंडोज है। – Artefacto

3

लघु जबाब:

विंडोज के अंतर्गत, आप PHP के साथ मनमाना फ़ाइल नाम का उपयोग नहीं कर सकते हैं; आप उन फ़ाइल नामों तक ही सीमित हैं जिनके नाम को वर्तमान में चयनित "कोड पेज" (क्षेत्रीय और भाषा विकल्प "," प्रारूप "पैनल और" प्रशासनिक "टैब पैनल" गैर-यूनिकोड प्रोग्राम के लिए भाषा "के साथ दर्शाया जा सकता है)।

लंबे समय तक उत्तर:

विंडोज UTF-16 Win2000 के बाद से फ़ाइल एन्कोडिंग के लिए उपयोग करता है, लेकिन पीएचपी एक "गैर-यूनिकोड अवगत कार्यक्रम 'के रूप में अंतर्निहित फाइल सिस्टम के साथ संवाद। इसका मतलब है कि एक वर्तमान "कोड पेज टेबल" है जो PHP स्ट्रिंग्स से यूटीएफ -16 तारों और इसके विपरीत के रूप में ट्रैनलेट करता है। पीएचपी से वर्तमान कोड पेज उदाहरण के लिए "language_country.codepage" के रूप में setlocale() के द्वारा प्राप्त किया जा सकता है,:

setlocale (LC_CTYPE, 0) ==> "english_United States.1252"

जहां 1252 वर्तमान में नियंत्रण कक्ष से चयनित विंडोज कोड पेज तालिका है; फ़ाइल सिस्टम से पुनर्प्राप्त फ़ाइल नाम उस कोड पेज का उपयोग करके एन्कोड किए गए हैं; PHP से जेनरेट किए गए फ़ाइल नाम को उस कोड पेज के अनुसार एन्कोड किया जाना चाहिए। चीजें इस तथ्य से और भी जटिल हैं कि यूटीएफ -16 फ़ाइल नामों को "सर्वश्रेष्ठ-फिट कोड पृष्ठ" का उपयोग करके PHP स्ट्रिंग्स में ट्रान्सलेट किया गया है, जो कि वास्तविक वर्ण/शब्दों का अनुमानित प्रतिनिधित्व है, इसलिए आप फ़ाइल नामों और पथों पर भरोसा नहीं कर सकते फ़ाइल सिस्टम से पुनर्प्राप्त किया गया क्योंकि उन्हें मनमाने ढंग से उलझाया जा सकता है।

संदर्भ:

http://en.wikipedia.org/wiki/Windows_code_page क्या "Windows कोड पृष्ठ" कर रहे हैं।

https://bugs.php.net/bug.php?id=47096 इस मुद्दे के बारे में अधिक जानकारी।

संबंधित मुद्दे