私はベトナム人で、次のような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
_は Code page 936 を表します。これはWindowsの簡体字中国語バージョンのデフォルトのコードページです。
あなたの問題も同様の方法で解決できると思います。
_$fn2 = iconv("UTF-8","cp1258", $base_dir.$fn);
_
OSのデフォルトコードページが_1258
_であるかどうかはよくわかりません。コマンドプロンプトを開き、コマンドchcp
を入力して自分でチェックする必要があります。次に、_1258
_をコマンドが提供するものに変更します。
[〜#〜] update [〜#〜]
PHPファイルシステム関数は、 この回答 によると、システムコードページにある文字のみを処理できます。したがって、2つの選択肢があります:
ファイル名の文字をシステムコードページに制限します-あなたの場合、それは_437
_です。しかし、コードページ437にはすべてのベトナム語の文字が含まれているわけではないと確信しています。
システムコードページをベトナム語の__1258
_に変更し、ファイル名を_cp1258
_に変換します。その後、ファイルシステム機能が動作するはずです。
どちらの選択肢も不十分です。
選択肢1:ベトナム語の文字は使用できなくなりましたが、これは望みのものではありません。
選択肢2:システムコードページを変更する必要があり、ファイル名の文字はコードページ1258に制限されます。
[〜#〜] update [〜#〜]
システムコードページの変更方法:
_Control Panel
_> Region
> Administrative
> _Change system locale
_に移動し、ドロップダウンメニューでVietnamese(Vietnam)
を選択します。
この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">
私はペルシャ語で、私の言語の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 );
唯一の解決策私はこれまでに見つけた..(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
;
ごめんなさい!あなたの質問はファイル名に関するものです。
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);
}?>