web-dev-qa-db-ja.com

PHP-utf-8ファイル名をアップロード

私はベトナム人で、次のような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

その感謝を修正する方法

23
DeLe

私はWindows 8中国語版を使用していますが、これに関する同様の問題に対処しています:

_$filename = iconv("utf-8", "cp936", $filename);
_

cpは_Code page_を表し、_cp936_は Code page 936 を表します。これはWindowsの簡体字中国語バージョンのデフォルトのコードページです。

あなたの問題も同様の方法で解決できると思います。

_$fn2 = iconv("UTF-8","cp1258", $base_dir.$fn);
_

OSのデフォルトコードページが_1258_であるかどうかはよくわかりません。コマンドプロンプトを開き、コマンドchcpを入力して自分でチェックする必要があります。次に、_1258_をコマンドが提供するものに変更します。

[〜#〜] update [〜#〜]

PHPファイルシステム関数は、 この回答 によると、システムコードページにある文字のみを処理できます。したがって、2つの選択肢があります:

  1. ファイル名の文字をシステムコードページに制限します-あなたの場合、それは_437_です。しかし、コードページ437にはすべてのベトナム語の文字が含まれているわけではないと確信しています。

  2. システムコードページをベトナム語の__1258_に変更し、ファイル名を_cp1258_に変換します。その後、ファイルシステム機能が動作するはずです。

どちらの選択肢も不十分です。

選択肢1:ベトナム語の文字は使用できなくなりましたが、これは望みのものではありません。

選択肢2:システムコードページを変更する必要があり、ファイル名の文字はコードページ1258に制限されます。

[〜#〜] update [〜#〜]

システムコードページの変更方法:

_Control Panel_> Region> Administrative> _Change system locale_に移動し、ドロップダウンメニューでVietnamese(Vietnam)を選択します。

14
Inglis Baderson

このmetaは効果がありません。

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

webサーバーは既にContent-Typeヘッダー。したがって、エンコーディングを決定します。 Webブラウザーは、同じエンコードでフォームを送信します。 metaは、ユーザーがオフラインのときに便利です。

そのため、httpヘッダーをsnedする必要がありますContent-Type 自分で:

<?php header("Content-Type: text/html; charset=utf-8"); ?>

html、コンテンツ、または送信されるものの前にこれを置くようにしてください。


または、accept-charsetタグのformはweelとして機能するはずです:

 <form accept-charset="utf-8"> 
5
Zaffy

私はペルシャ語で、私の言語のutf-8文字にも同じ問題があります。私はこのコードで問題を解決できました:

$fn = $_FILES["upload"]["name"]; // name of file have some utf-8 characters
$name=iconv('utf-8','windows-1256', str_replace('ی', 'ي', $fn));
move_uploaded_file($_FILES["upload"]["tmp_name"],$name );

よくわかりません vientam言語についてですが、上記と同じコードをいくつか変更して使用できます:

$fn = $_FILES["upload"]["name"]; // name of file have some utf-8 characters
$name=iconv('utf-8','cp936', $fn);
move_uploaded_file($_FILES["upload"]["tmp_name"],$name );
1
rezaSefiddashti

唯一の解決策私はこれまでに見つけた..(2014年):

1)FTPにTF-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;

1
T.Todua

はじめに、ファイル名のエンコードを検出します(アップロードする前に)。

print_r($_FILES["upload"]);

ファイル名を decoder に挿入し、エンコードを確認します。

0
iproger

ごめんなさい!あなたの質問はファイル名に関するものです。

Iconvでファイル名を保存する必要がありますが、これなしで読んでください。

保存用:

<?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);
}?>
0
Danoosh