PHP - загрузить utf-8 filename
Я вьетнамский, и я хочу загрузить имя файла 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
Как исправить это спасибо
Ответы
Ответ 1
Я использую китайскую версию 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
на то, что дает команда.
Забастовкa >
UPDATE
Кажется, что функции файловой системы PHP могут обрабатывать только символы, которые находятся в системной кодовой странице, в соответствии с этим ответом. Итак, у вас есть 2 варианта:
-
Ограничьте символы в имени файла системной кодовой страницей - в вашем случае, 437
. Но я уверен, что кодовая страница 437 не содержит всех вьетнамских символов.
-
Измените кодовую страницу системы на vietnamese: 1258
и преобразуйте имя файла в cp1258
. Тогда функции файловой системы должны работать.
Оба варианта недостаточны:
Выбор 1: вы больше не можете использовать символы vietnamese, чего вы не хотите.
Выбор 2: вам нужно изменить страницу системного кода, а имена файлов ограничены кодовой страницей 1258.
UPDATE
Как изменить страницу системного кода:
Перейдите в Control Panel
> Region
> Administrative
> Change system locale
и выберите Vietnamese(Vietnam)
в выпадающем меню.
Ответ 2
Этот meta
не имеет эффекта:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
потому что веб-сервер уже отправил заголовок Content-Type
и, таким образом, решил, какова будет кодировка. Веб-браузеры отправляют формы в одной кодировке. meta
полезен, когда пользователь отключен.
Таким образом, вы должны сначала сжать http-заголовок Content-Type
:
<?php header("Content-Type: text/html; charset=utf-8"); ?>
убедитесь, что вы поместили это перед любым html, контентом или любым другим.
Альтернативно, тег accept-charset
на form
должен работать как weel:
<form accept-charset="utf-8">
Ответ 3
Единственное решение, которое я нашел до сих пор.. (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) Теперь вы можете переименовать (или и т.д.) $newname
;
Ответ 4
Для начала необходимо определить кодировку имени файла (перед загрузкой).
print_r($_FILES["upload"]);
Вставьте имя файла в decoder и проверьте кодировку.
Ответ 5
Извините! ваш вопрос касается имени файла.
Вы должны сохранить свое имя файла с помощью значка, но без него.
для сохранения:
<?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);
}?>
Ответ 6
попробуйте это
$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);
}
Ответ 7
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) ;
Ответ 8
Вы можете использовать этот
$fn2 = basename($_FILES['upload']['name']);