PHP で中国語ファイルをアップロードするとファイル名が文字化けする問題

WBOY
リリース: 2016-06-23 13:40:40
オリジナル
1140 人が閲覧しました

PHP でファイルをアップロードすることは最も基本的な技術的な点ですが、さらに深く進むと、解決する必要がある問題がたくさんあります。いいえ、中国語のファイルをアップロードすると、ファイル名が文字化けします。

以下は問題のコードです。非常に簡単です:

1. 問題のコード

html 部分:

 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>
ログイン後にコピー

php 部分:

 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" ファイルが、おお、ファイルはアップロードされましたが、ファイル名が文字化けしています。

2. まず試してください

インターネットで解決策を検索し、

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"

つまり、中国語は変換できず、近い文字も変換できません変換された. いや、ネットで紹介されている方法は万能ではないようです。

3. オンラインで紹介されている方法は失敗しました、もう一度試してください

私の環境では中国語ファイルを作成する際に文字化けが起こるのではないかと思い、コードを書き直しました:

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"]));
ログイン後にコピー

問題は解決しました、もう文字化けはありません

4. 別の解決策

実際には、別の解決策があります。 html ファイルなので、エンコーディングは統一されたままなので、もうトランスコードする必要はありません

5. 結論は次のとおりです

実際、iconv 関数を使用すると、アップロード時に中国語のファイル名が文字化けする問題を解決できます。一貫性のないエンコーディングの文字化け問題によって引き起こされるさまざまな問題を解決できます。

iconv 関数を使用するときは、ソース文字列のエンコーディングがまだ決まっていない限り、最初にソース文字列のエンコーディングを確認してください。
  1. すべてのコードが一貫してエンコードされていることを確認し、iconv 関数は最後の手段としてのみ使用してください。
  2. サーバー上に保存されるファイル名には中国語のファイル名を使用しないようにしてください。ファイル名は独自のファイル名に変換してください(英語のファイル名でも変換してください)。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート