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 Stackru
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 ответов

Другие вопросы по тегам