|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2017-08-11 10:14 UTC] anrdaemon at freemail dot ru
Description: ------------ Many filesystem functions that read, write or otherwise deal with file names are unable to work with multibyte encoded filenames, such as when internal_encoding is equal to UTF-8. Even the example in https://php.net/opendir doesn't work, if a path contains multibyte sequences. Test script: --------------- <?php print ini_get("internal_encoding") . "\n"; print ini_get("default_charset") . "\n"; foreach(["test", "тест"] as $fn) file_put_contents("$fn.txt", ""); print_r(glob("*.txt")); Expected result: ---------------- $ php -nf ./xx.php UTF-8 Array ( [0] => test.txt [1] => тест.txt ) Actual result: -------------- $ php -nf ./xx.php UTF-8 Array ( [0] => test.txt ) PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Thu Oct 30 22:00:01 2025 UTC |
Weird. Works for me if only filename contains multibyte characters, but breaks when path contains them also, but again, only for multibyte file names. Can you please try it with parent directory name contaning multibyte characters? Another interesting finding: getcwd() returns natively encoded filename. $ php.exe -nf opendir.php <?php print file_get_contents(__FILE__) . "-- \n"; print ini_get("internal_encoding") . "\n"; print ini_get("default_charset") . "\n"; print getcwd() . "\n"; print iconv('CP1251', 'UTF-8', getcwd()) . "\n"; foreach(["test", "тест"] as $fn) file_put_contents("$fn.txt", ""); if ($dh = opendir(getcwd())) { while (($file = readdir($dh)) !== false) { echo "filename: $file : filetype: " . filetype($file) . "\n"; } closedir($dh); } -- UTF-8 C:\dev\temp\ C:\dev\temp\тест filename: . : filetype: dir filename: .. : filetype: dir filename: opendir.php : filetype: file filename: test.txt : filetype: file filename: UTF-8.php : filetype: file Warning: filetype(): Lstat failed for тест.txt in C:\dev\temp\тест\opendir.php on line 12 filename: тест.txt : filetype: