Frage

Ich habe ein Verzeichnis, das mehrere Dateien enthält, von denen viele nicht-Englisch Namen hat. Ich bin mit PHP in Windows 7.

Ich mag die Dateinamen und dessen Inhalts zur Liste mit PHP.

Zur Zeit verwende ich DirectoryIterator und file_get_contents. Dies funktioniert für Englisch-Dateien Namen, aber nicht für nicht-englische (chinesisch) Dateinamen.

Zum Beispiel habe ich Dateinamen wie "?? ?? ?????????. Eml", "hallo ? ? ? ? ? ? EML".

  1. DirectoryIterator nicht in der Lage ist, die Dateinamen mit ->getFilename() zu bekommen
  2. file_get_contents ist auch noch nicht öffnen kann, wenn ich hart Code des Dateiname in seinen Parametern.

Wie kann ich es tun?

War es hilfreich?

Lösung

Dies ist nicht möglich. Es ist eine Beschränkung von PHP. PHP verwendet die Multibyte-Versionen von Windows-APIs; Sie auf die Zeichen beschränkt Ihre Codepage darstellen kann.

Siehe .

Verzeichnis Inhalt:

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

Test Dateiinhalt:

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

Testdatei Ergebnisse:

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

Debugger Ausgabe:

Anrufstapel (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

Ist es wirklich ein Fragezeichen?

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 '?'

Ja! Es ist Zeichen # 63.

Andere Tipps

Kurze Antwort:

Unter Windows können Sie Zugriff nicht willkürlich Dateinamen mit PHP; Sie sind auf diese Dateinamen, dessen Namen mit der aktuell ausgewählten „Codepage“ (siehe Regions- und Sprachoptionen“,‚Format‘Panel und‚Administrative‘Registerfeld‚Sprache für Nicht-Unicode-Programme‘).

Längere Antwort:

verwendet Windows UTF-16 für Dateicodierung seit Win2000, aber PHP kommuniziert mit dem zugrunde liegenden Dateisystem als „Nicht-Unicode-aware-Programm“. Dies bedeutet, dass eine Strom „-Code Seitentabelle“, dass tranlates von PHP Strings UTF-16-Strings und umgekehrt. Von PHP kann die aktuelle Codepage von setlocale () in der Form "language_country.codepage", beispielsweise abgerufen werden:

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

, wo 1252 die Windows-Codepage Tabelle wird derzeit über das Bedienfeld ausgewählt; Dateinamen aus dem Dateisystem abgerufen werden codiert, dass die Codepage verwendet wird; Dateinamen von PHP generiert werden, müssen nach dieser Codepage codiert werden. Die Dinge werden noch durch die Tatsache erschwert, dass UTF-16-Dateinamen zu PHP Strings traslated sind die „best-fit-Codepage“ verwenden, die eine approxymated Darstellung der tatsächlichen Zeichen / Wörter ist, so dass Sie nicht vertrauen auf Dateinamen und Pfade aus dem Dateisystem abgerufen, da sie willkürlich könnten verstümmelt werden.

Referenzen:

http://en.wikipedia.org/wiki/Windows_code_page Was "Windows Codepages" sind.

https://bugs.php.net/bug.php?id=47096 Mehr Informationen zu diesem Thema.

Do entdecken Sie die Dateien, die ich dieses Skript haben:

$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";

Dies wird erfolgreich die Datei finden: ? ? ? ? ? ? Ich habe versucht, es hier auf einer Linux-Distro obwohl ..

, es lesen Sie verwenden: Zeile für Zeile:

$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
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top