PHP でファイルをアップロードすることは最も基本的な技術的な点ですが、さらに深く進むと、解決する必要がある問題がたくさんあります。いいえ、中国語のファイルをアップロードすると、ファイル名が文字化けします。
以下は問題のコードです。非常に簡単です:
1 <html> 2 <body> 3 4 <form action="upload_file.php" method="post" 5 enctype="multipart/form-data"> 6 <label for="file">Filename:</label> 7 <input type="file" name="file" id="file" /> 8 <br /> 9 <input type="submit" name="submit" value="Submit" />10 </form>11 12 </body>13 </html>
1 <?php 2 if ($_FILES["file"]["error"] > 0) 3 { 4 echo "Return Code: " . $_FILES["file"]["error"] . "<br />"; 5 }else 7 { 8 echo "Upload: " . $_FILES["file"]["name"] . "<br />"; 9 echo "Type: " . $_FILES["file"]["type"] . "<br />";10 echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";11 echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";12 13 if (file_exists("upload/" . $_FILES["file"]["name"]))14 {15 echo $_FILES["file"]["name"] . " already exists. ";16 }17 else18 {19 move_uploaded_file($_FILES["file"]["tmp_name"],20 "upload/" . $_FILES["file"]["name"]); } }
「テストデータ」という名前のファイル。 tx t" ファイルが、おお、ファイルはアップロードされましたが、ファイル名が文字化けしています。
インターネットで解決策を検索し、
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
を
move_uploaded_file($_FILES["file"]["tmp_name"],"upload/" . iconv("UTF-8","gbk",$_FILES["file"]["name"]));
に変更すると、iconv 関数の戻り値が false であることがわかります。
関数のマニュアルを確認すると、2 番目のパラメータには特別な使い方があることがわかります。簡単な変換では、エンコーディングの後に //TRANSLIT または //IGNORE を追加すると、変換できない文字が最も近い文字に変換されます。変換できない文字は無視されます。
試してみます:
1 var_dump( iconv("UTF-8","gbk//TRANSLIT",$_FILES["file"]["name"]));2 var_dump( iconv("UTF-8","gbk//IGNORE",$_FILES["file"]["name"]));
結果:
bool(false) string(4) ".txt"
つまり、中国語は変換できず、近い文字も変換できません変換された. いや、ネットで紹介されている方法は万能ではないようです。
私の環境では中国語ファイルを作成する際に文字化けが起こるのではないかと思い、コードを書き直しました:
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/测试数据.txt");
結果は文字化けせずに正常に作成されました。 。 。つまり、システムの問題ではありません。
考えてみてください、私の php ファイル自体は utf8 でエンコードされており、ステートメント
move_uploaded_file($_FILES["file"]["tmp_name"],"upload/测试数据.txt");
は utf8 エンコードを使用する必要があり、以前にアップロードしたファイル名は utf8 エンコードであってはならず、次のステートメントは間違っているはずです。ソース文字列自体は utf8 でエンコードされていません:
iconv("UTF-8","gbk//TRANSLIT",$_FILES["file"]["name"]);
関数を使用してソース文字列のエンコードを確認します:
1 $e=mb_detect_encoding($text, array(‘UTF-8’, ‘GBK’,’gb2312’));2 echo $e;
結果は CP936、つまりソース文字列エンコードは GBK です。
試してみてください
move_uploaded_file($_FILES["file"]["tmp_name"],"upload/" . iconv("gbk","UTF-8",$_FILES["file"]["name"]));
問題は解決しました、もう文字化けはありません
実際には、別の解決策があります。 html ファイルなので、エンコーディングは統一されたままなので、もうトランスコードする必要はありません
5. 結論は次のとおりです
実際、iconv 関数を使用すると、アップロード時に中国語のファイル名が文字化けする問題を解決できます。一貫性のないエンコーディングの文字化け問題によって引き起こされるさまざまな問題を解決できます。