utf 8 — PHP: необходим UTF8_decode с фильтром для значений ASCII 126-160; предложенное решение

Я ранее начал изучать эту проблему Вот. Вот настоящая проблема и предлагаемое решение:

Имена файлов со значениями символов 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 () для исключения определенных значений символов, ничего из этого не потребовалось бы.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …