Я вьетнамский, и я хочу загрузить файл utf-8, например
Tên Tệp Tiếng Việt.JPG
Вот мой код
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>utf-8</title> </head> <body> <?php if(isset($_POST["submit"])) { if($_FILES["upload"]["error"] > 0 ) echo "FILE ERROR!"; else { $base_dir = "D:/"; $fn = $_FILES["upload"]["name"]; $fn2 = $base_dir.$fn; move_uploaded_file($_FILES["upload"]["tmp_name"],$fn2); } } ?> <form action="" method="post" enctype="multipart/form-data" name="form1" id="form1"> <input type="file" name="upload" id="upload" /> <input type="submit" name="submit" id="submit" value="Send" /> </form> </body> </html>
но когда я загружаю, что вижу на своем компьютере, D: \ имеет файл вроде
Tên Tệp Tiếng Việt.JPG
Как исправить это спасибо
Я нахожусь в китайской версии Windows 8, и я имею дело с подобной проблемой:
$filename = iconv("utf-8", "cp936", $filename);
cp
означает « Code page
а cp936
означает « Кодовая страница 936» , которая является кодовой страницей по умолчанию упрощенной китайской версии Windows.
Поэтому я думаю, что, может быть, ваша проблема может быть решена аналогичным образом:
$fn2 = iconv("UTF-8","cp1258", $base_dir.$fn);
Я не совсем уверен, является ли стандартная кодовая страница вашей ОС 1258
или нет, вы должны проверить ее самостоятельно, открыв командную строку и введите команду chcp
. Затем измените значение 1258
на то, что команда дает вам.
ОБНОВИТЬ
Похоже, что функции файловой системы PHP могут обрабатывать только символы, которые находятся в системной кодовой странице, в соответствии с этим ответом . Итак, у вас есть 2 варианта:
Ограничьте символы в имени файла системной кодовой страницей – в вашем случае это 437
. Но я уверен, что кодовая страница 437 не содержит всех вьетнамских символов.
Измените кодовую страницу системы на vietnamese один: 1258
и преобразуйте имя файла в cp1258
. Тогда функции файловой системы должны работать.
Оба варианта недостаточны:
Выбор 1: вы больше не можете использовать символы vietnamese, чего вы не хотите.
Выбор 2: вам нужно изменить страницу системного кода, а имена файлов ограничены кодовой страницей 1258.
ОБНОВИТЬ
Как изменить системную кодовую страницу:
Перейдите в Control Panel
> Region
> Administrative
> Change system locale
и выберите Vietnamese(Vietnam)
в раскрывающемся меню.
Эта meta
не влияет:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
потому что веб-сервер уже отправил заголовок Content-Type
и, таким образом, решил, какова будет кодировка. Веб-браузеры отправляют формы в одной кодировке. meta
используется, когда пользователь отключен.
Таким образом, вы должны sned http-заголовок Content-Type
самостоятельно:
<?php header("Content-Type: text/html; charset=utf-8"); ?>
убедитесь, что вы помещаете это перед любым html, контентом или любым другим.
В качестве альтернативы, тег accept-charset
в form
должен работать как результат:
<form accept-charset="utf-8">
Единственное решение, которое я нашел до сих пор .. (2014 год):
1) Я не хранил файлы на своем FTP в строке UTF-8 . Вместо этого я использую эту функцию, чтобы переименовать загруженные файлы:
<?php // use your custom function.. for example, utf8_encode $newname = utf8_encode($_FILES["uploadFile"]["name"]); move_uploaded_file($_FILES["uploadFile"]["tmp_name"], $newname); ?>
2) Теперь вы можете переименовать (или etc) $newname
;
Для начала необходимо определить кодировку имени файла (перед загрузкой).
print_r($_FILES["upload"]);
Вставьте имя файла в декодер и проверьте кодировку.
Сожалею! ваш вопрос касается имени файла.
Вы должны сохранить свое имя файла с помощью значка, но без него.
для сохранения:
<?php $name = $_FILES['photo']['name']; $unicode = iconv('windows-1256', 'utf-8', $name); move_uploaded_file($_FILES['photo']['tmp_name'], 'photos/' . $name); mysql_query("INSERT INTO `photos` (`filename`) VALUES ('{$unicode}')"); ?>
для чтения:
<?php $images = mysql_query('SELECT * FROM `photos`'); if($images && mysql_num_rows($images) > 0) { while($image = mysql_fetch_assoc($images)) { $name = iconv('utf-8', 'windows-1256', $image['filename']); echo '<img src="photos/' . $name . '"/>'; } mysql_free_result($images); }?>
попробуй это
$imgname = $_FILES['img'] ['name'] ; $imgsize = $_FILES['img'] ['size'] ; $imgtmpname = $_FILES['img'] ['tmp_name'] ; $imgtype = $_FILES['img'] ['type'] ; $size = 1024; $imgtypes = array('image/jpeg','image/gif','image/png'); $folder = "up"; if(empty($imgname)){ echo "Shose ur photo"; }else if(!in_array($imgtype,$imgtypes)){ echo "this photo type is not avalable"; }else if($imgsize > $size){ echo "this photo is dig than 6 MB"; }else if($imgwidth > 5000){ echo "the file is to big"; } else{ move_uploaded_file($imgtmpname, $folder, $filename); }
function convToUtf8($str) { if( mb_detect_encoding($str,"UTF-8, ISO-8859-1, GBK")!="UTF-8" ) { return iconv("gbk","utf-8",$str); } else { return $str; } } $filename= convToUtf8($filename) ;
Вы можете использовать это
$fn2 = basename($_FILES['upload']['name']);