PHP scandir() и htmlentities (): проблемы с кодировкой и / или специальными символами

Я использую jqueryFileTree чтобы показать список каталогов на сервере со ссылками на скачивание файлов в каталоге. Недавно я столкнулся с проблемой с файлами, которые содержат специальные символы:

    1 ответов


    мое лучшее предположение заключается в том, что само имя файла не использует UTF-8. Или по крайней мере scandir() не поднимает его так.

    может быть mb_detect_encoding() может пролить свет?

    var_dump(mb_detect_encoding($filename));
    

    если нет, попробуйте угадать кодировку (CP1252 или ISO-8859-1 будет моей первой догадкой) и преобразовать ее в UTF-8, посмотрите, действителен ли вывод:

    var_dump(mb_convert_encoding($filename, 'UTF-8', 'Windows-1252'));
    var_dump(mb_convert_encoding($filename, 'UTF-8', 'ISO-8859-1'));
    var_dump(mb_convert_encoding($filename, 'UTF-8', 'ISO-8859-15'));
    

    или через iconv():

    var_dump(iconv('WINDOWS-1252', 'UTF-8', $filename));
    var_dump(iconv('ISO-8859-1',   'UTF-8', $filename));
    var_dump(iconv('ISO-8859-15',  'UTF-8', $filename));
    

    затем, когда вы выяснили, какая кодировка используется, ваш код должен выглядеть примерно так (предполагая CP1252):

    $filename = htmlentities(mb_convert_encoding($filename, 'UTF-8', 'Windows-1252'), ENT_QUOTES, 'UTF-8');