[PHP] Преименуване на файл със символи на кирилица


1
Опитвам се да преименувам файл upload-нат през форма. Като за съставянето на част от новото име използвам въведения текст в един input type text. Това поле може да съдържа кирилица и проблема, е че когато има кирилица изкарва името в шльокавица. За сървър използвам предоставените от superhosting хостинг акаунти с настройките по подразбиране на php.ini файла



Отговори



1
По принцип hosting компаниите са базирани на Linux машини. By default те са сетнати на UTF-8. Ако не си сетнал UTF-8 за charset на страницата от която се upload-ва , то би било възможно текста който е написан в текстовото поленце да се предава погрешно към сървъра, а оттам и файловете се преименуват с кофти имена.

от dam_dam (578 точки)


0
Set-нал съм utf-8 charset на страницата чрез мета таг, нещо друго трябва ли да направя? Аз си мислех дали не трябва да се пипа в header-а на заявките...

от NikiOnTime (1139 точки)


1

Привет,

Ако iconv  не ти върши работа, погледни в коментарите има различни предложения.Например:

 
nikolai-dot-zujev-at-gmail-dot-com
8 years ago
Here is an example how to convert windows-1251 (windows) or cp1251(Linux/Unix) encoded string to UTF-8 encoding.

<?php
function cp1251_utf8( $sInput )
{
   
$sOutput = "";

    for (
$i = 0; $i < strlen( $sInput ); $i++ )
    {
       
$iAscii = ord( $sInput[$i] );

        if (
$iAscii >= 192 && $iAscii <= 255 )
           
$sOutput .=  "&#".( 1040 + ( $iAscii - 192 ) ).";";
        else if (
$iAscii == 168 )
           
$sOutput .= "&#".( 1025 ).";";
        else if (
$iAscii == 184 )
           
$sOutput .= "&#".( 1105 ).";";
        else
           
$sOutput .= $sInput[$i];
    }
   
    return
$sOutput;
}

?>

 


от ochankov (119 точки)


0
Проблема е, че не знам какъв енкодинг ще използва User-а.

от NikiOnTime (1139 точки)

0
Предполагам, че oт PHP-то генерираш страницата от която се качват файловете, така че ти сетваш на user-a какво да ползва ... Или ти си само server и не е ясно от къде ти идват файловете и текста ?

от dam_dam (578 точки)



1

Аз лично използвам това:

 

function repairCyrFilePath($txt)
    {
        $cyr  = array('а','б','в','г','д','е','ж','з','и','й','к','л','м','н','о','п','р','с','т','у', 
        'ф','х','ц','ч','ш','щ','ъ','ь', 'ю','я','А','Б','В','Г','Д','Е','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У',
        'Ф','Х','Ц','Ч','Ш','Щ','Ъ','Ь', 'Ю','Я', ' ', '$' );
        $lat = array( 'a','b','v','g','d','e','zh','z','i','y','k','l','m','n','o','p','r','s','t','u',
        'f' ,'h' ,'ts' ,'ch','sh' ,'sht' ,'a' ,'y' ,'yu' ,'ya','A','B','V','G','D','E','Zh',
        'Z','I','Y','K','L','M','N','O','P','R','S','T','U',
'F' ,'H' ,'Ts' ,'Ch','Sh' ,'Sht' ,'A' ,'Y' ,'Yu' ,'Ya', '', '_' );
        return str_replace($cyr, $lat, $txt);
    }
 
И преобразуването: 
 
$usr_file_name = repairCyrFilePath(basename( $_FILES['file_logo']['name']) );
 
Може да си премахнеш всичко, което смяташ за ненужно, като например \
 
Дано съм помогнал.

от ryordanov (0 точки)


0
И аз до него опрях... отказах се от имена с кирилица, може би нещо с файловата система на сървъра...

от NikiOnTime (1139 точки)


1

Ами трябва да сетнеш енкодинга на файла, през който се въвежда информацията и да зададеш енкодинг по този начин във файла който обработва информацията .
mb_internal_encoding("UTF-8");

Освен това увери се ,че енкодинга в базата също е utf8-unicode-ci , ако си създал база с друг енкодинг и след това си го променил е възможно промените да не са се отразили на таблицата където пазиш името на файла.


от ViktorLalev (117 точки)