Я ранее начал изучать эту проблему Вот. Вот настоящая проблема и предлагаемое решение:
Имена файлов со значениями символов ASCII от 32 до 255 представляют проблему для utf8_encode (). В частности, он не обрабатывает значения символов включительно между 126 и 160 правильно. Хотя имена файлов с этими именами символов могут быть записаны в базу данных, передача этих имен в функцию в коде PHP приведет к появлению сообщений об ошибках, указывающих, что файл не может быть найден и т. Д.
Я обнаружил это при попытке передать имя файла с оскорбительными символами в getimagesize ().
Для utf8_encode необходим фильтр, чтобы ИСКЛЮЧИТЬ преобразование включающих значений между 126 и 160, ВКЛЮЧАЯ преобразование всех других символов (или любых символов, символов или диапазонов символов, указанных пользователем; мой предназначен для указанных диапазонов). по указанной причине).
Разработанное мной решение требует двух функций, перечисленных ниже, и их применения, которое следует:
// With thanks to Mark Baker for this function, posted elsewhere on StackOverflow
function _unichr($o) {
if (function_exists('mb_convert_encoding')) {
return mb_convert_encoding('&#'.intval($o).';', 'UTF-8', 'HTML-ENTITIES');
} else {
return chr(intval($o));
}
}
// For each character where value is inclusively between 126 and 160,
// write out the _unichr of the character, else write out the UTF8_encode of the character
function smart_utf8_encode($source) {
$text_array = str_split($source, 1);
$new_string = '';
foreach ($text_array as $character) {
$value = ord($character);
if ((126 <= $value) && ($value <= 160)) {
$new_string .= _unichr($character);
} else {
$new_string .= utf8_encode($character);
}
}
return $new_string;
}
$file_name = "abcdefghijklmnopqrstuvxyz~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”–—˜™š›œžŸ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ.jpg";
// This MUST be done first:
$file_name = iconv('UTF-8', 'WINDOWS-1252', $file_name);
// Next, smart_utf8_encode the variable (from encoding.inc.php):
$file_name = smart_utf8_encode($file_name);
// Now the file name may be passed to getimagesize(), etc.
$getimagesize = getimagesize($file_name);
Если бы только PHP7 (6 пропускался при нумерации, да?) Включал бы фильтр в utf8_encode () для исключения определенных значений символов, ничего из этого не потребовалось бы.
Задача ещё не решена.
Других решений пока нет …