ホームページ > バックエンド開発 > PHPチュートリアル > PHP で中国語ファイルをアップロードする際のファイル名文字化けに関する問題

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

WBOY
リリース: 2016-06-13 12:14:30
オリジナル
902 人が閲覧しました

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

php でファイルをアップロードすることは最も基本的な技術点ですが、さらに深く進むと、解決する必要がある問題がたくさんあります。いいえ、アップロードした後です。中国語のファイルだとファイル名が意味不明になってしまいました。

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

1. 問題のコード

html 部分:

<span style="color: #008080;"> 1</span> <span style="color: #0000ff;"><</span><span style="color: #800000;">html</span><span style="color: #0000ff;">></span><span style="color: #008080;"> 2</span> <span style="color: #0000ff;"><</span><span style="color: #800000;">body</span><span style="color: #0000ff;">></span><span style="color: #008080;"> 3</span> <span style="color: #008080;"> 4</span> <span style="color: #0000ff;"><</span><span style="color: #800000;">form </span><span style="color: #ff0000;">action</span><span style="color: #0000ff;">="upload_file.php"</span><span style="color: #ff0000;"> method</span><span style="color: #0000ff;">="post"</span><span style="color: #008080;"> 5</span> <span style="color: #ff0000;">enctype</span><span style="color: #0000ff;">="multipart/form-data"</span><span style="color: #0000ff;">></span><span style="color: #008080;"> 6</span> <span style="color: #0000ff;"><</span><span style="color: #800000;">label </span><span style="color: #ff0000;">for</span><span style="color: #0000ff;">="file"</span><span style="color: #0000ff;">></span>Filename:<span style="color: #0000ff;"></</span><span style="color: #800000;">label</span><span style="color: #0000ff;">></span><span style="color: #008080;"> 7</span> <span style="color: #0000ff;"><</span><span style="color: #800000;">input </span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="file"</span><span style="color: #ff0000;"> name</span><span style="color: #0000ff;">="file"</span><span style="color: #ff0000;"> id</span><span style="color: #0000ff;">="file"</span> <span style="color: #0000ff;">/></span> <span style="color: #008080;"> 8</span> <span style="color: #0000ff;"><</span><span style="color: #800000;">br </span><span style="color: #0000ff;">/></span><span style="color: #008080;"> 9</span> <span style="color: #0000ff;"><</span><span style="color: #800000;">input </span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="submit"</span><span style="color: #ff0000;"> name</span><span style="color: #0000ff;">="submit"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="Submit"</span> <span style="color: #0000ff;">/></span><span style="color: #008080;">10</span> <span style="color: #0000ff;"></</span><span style="color: #800000;">form</span><span style="color: #0000ff;">></span><span style="color: #008080;">11</span> <span style="color: #008080;">12</span> <span style="color: #0000ff;"></</span><span style="color: #800000;">body</span><span style="color: #0000ff;">></span><span style="color: #008080;">13</span> <span style="color: #0000ff;"></</span><span style="color: #800000;">html</span><span style="color: #0000ff;">></span>
ログイン後にコピー

php パート:

<span style="color: #008080;"> 1</span> <?<span style="color: #000000;">php</span><span style="color: #008080;"> 2</span> <span style="color: #0000ff;">if</span> (<span style="color: #800080;">$_FILES</span>["file"]["error"] > 0<span style="color: #000000;">)</span><span style="color: #008080;"> 3</span> <span style="color: #000000;">{</span><span style="color: #008080;"> 4</span>     <span style="color: #0000ff;">echo</span> "Return Code: " . <span style="color: #800080;">$_FILES</span>["file"]["error"] . "<br />"<span style="color: #000000;">;</span><span style="color: #008080;"> 5</span> <span style="color: #000000;">}</span><span style="color: #0000ff;">else</span><span style="color: #008080;"> 7</span> <span style="color: #000000;">{</span><span style="color: #008080;"> 8</span>     <span style="color: #0000ff;">echo</span> "Upload: " . <span style="color: #800080;">$_FILES</span>["file"]["name"] . "<br />"<span style="color: #000000;">;</span><span style="color: #008080;"> 9</span>     <span style="color: #0000ff;">echo</span> "Type: " . <span style="color: #800080;">$_FILES</span>["file"]["type"] . "<br />"<span style="color: #000000;">;</span><span style="color: #008080;">10</span>     <span style="color: #0000ff;">echo</span> "Size: " . (<span style="color: #800080;">$_FILES</span>["file"]["size"] / 1024) . " Kb<br />"<span style="color: #000000;">;</span><span style="color: #008080;">11</span>     <span style="color: #0000ff;">echo</span> "Temp file: " . <span style="color: #800080;">$_FILES</span>["file"]["tmp_name"] . "<br />"<span style="color: #000000;">;</span><span style="color: #008080;">12</span> <span style="color: #008080;">13</span>     <span style="color: #0000ff;">if</span> (<span style="color: #008080;">file_exists</span>("upload/" . <span style="color: #800080;">$_FILES</span>["file"]["name"<span style="color: #000000;">]))</span><span style="color: #008080;">14</span> <span style="color: #000000;">    {</span><span style="color: #008080;">15</span>         <span style="color: #0000ff;">echo</span> <span style="color: #800080;">$_FILES</span>["file"]["name"] . " already exists. "<span style="color: #000000;">;</span><span style="color: #008080;">16</span> <span style="color: #000000;">    }</span><span style="color: #008080;">17</span>     <span style="color: #0000ff;">else</span><span style="color: #008080;">18</span> <span style="color: #000000;">    {</span><span style="color: #008080;">19</span>       <span style="color: #008080;">move_uploaded_file</span>(<span style="color: #800080;">$_FILES</span>["file"]["tmp_name"],<span style="color: #008080;">20</span>       "upload/" . <span style="color: #800080;">$_FILES</span>["file"]["name"]);<br>       }<br>   }
ログイン後にコピー

が「Test」という名前のファイルをアップロードしましたデータ.txt」ファイル、あれ、ファイルはアップロードされましたが、ファイル名が文字化けしていました。

2. まず試してください

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

<span style="color: #008080;">move_uploaded_file</span>(<span style="color: #800080;">$_FILES</span>["file"]["tmp_name"], "upload/" . <span style="color: #800080;">$_FILES</span>["file"]["name"]);
ログイン後にコピー

<span style="color: #008080;">move_uploaded_file</span>(<span style="color: #800080;">$_FILES</span>["file"]["tmp_name"],"upload/" . <span style="color: #008080;">iconv</span>("UTF-8","gbk",<span style="color: #800080;">$_FILES</span>["file"]["name"]));
ログイン後にコピー

に変更され、iconv 関数の戻り値が false であることが判明しました。

関数のマニュアルを確認して、2 番目のパラメーターに特別な使い方があることを確認してください。エンコーディングの後に //TRANSLIT または //IGNORE を追加できます。翻訳できない文字は最も近い文字に変換され、後者は変換できない文字を単に無視します。



試してみる:

<span style="color: #008080;">1</span> <span style="color: #008080;">var_dump</span>( <span style="color: #008080;">iconv</span>("UTF-8","gbk//TRANSLIT",<span style="color: #800080;">$_FILES</span>["file"]["name"<span style="color: #000000;">]));</span><span style="color: #008080;">2</span> <span style="color: #008080;">var_dump</span>( <span style="color: #008080;">iconv</span>("UTF-8","gbk//IGNORE",<span style="color: #800080;">$_FILES</span>["file"]["name"]));
ログイン後にコピー

結果:

bool(false) string(4) ".txt"

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

推測、中国語ファイルを作成するときにシステムが失敗する可能性があります 文字化け, なのでコードを書き直しました:

<span style="color: #008080;">move_uploaded_file</span>(<span style="color: #800080;">$_FILES</span>["file"]["tmp_name"], "upload/测试数据.txt");
ログイン後にコピー

結果は文字化けすることなく正常に作成されました。 。 。つまり、システムの問題ではありません。

考えてみてください。私の PHP ファイル自体は utf8 でエンコードされており、ステートメント

<span style="color: #008080;">move_uploaded_file</span>(<span style="color: #800080;">$_FILES</span>["file"]["tmp_name"],"upload/测试数据.txt");
ログイン後にコピー

は間違いなくUTF8 エンコードを使用する場合、以前にアップロードしたファイル名を UTF8 でエンコードしてはなりません。ソース文字列自体が UTF8 でエンコードされていないため、次のステートメントは間違っているはずです:

<span style="color: #008080;">iconv</span>("UTF-8","gbk//TRANSLIT",<span style="color: #800080;">$_FILES</span>["file"]["name"]);
ログイン後にコピー
関数を使用してソース文字列のエンコーディングを確認します:

<span style="color: #008080;">1</span> <span style="color: #800080;">$e</span>=mb_detect_encoding(<span style="color: #800080;">$text</span>, <span style="color: #0000ff;">array</span>(‘UTF-8’, ‘GBK’,<span style="color: #000000;">’gb2312’));</span><span style="color: #008080;">2</span> <span style="color: #0000ff;">echo</span> <span style="color: #800080;">$e</span>;
ログイン後にコピー

結果は CP936 で、これがソース文字列エンコーディングです。 GBKです。

試してください

<span style="color: #008080;">move_uploaded_file</span>(<span style="color: #800080;">$_FILES</span>["file"]["tmp_name"],"upload/" . <span style="color: #008080;">iconv</span>("gbk","UTF-8",<span style="color: #800080;">$_FILES</span>["file"]["name"]));
ログイン後にコピー

問題は解決しました、文字化けはなくなりました

4.また、1つの解決策

実は別の解決策があります。それは、HTML の head タグの途中に

<span style="color: #0000ff;"><</span><span style="color: #800000;">meta </span><span style="color: #ff0000;">http-equiv</span><span style="color: #0000ff;">="Content-Type"</span><span style="color: #ff0000;"> content</span><span style="color: #0000ff;">="text/html; charset=utf-8"</span> <span style="color: #0000ff;">/></span>
ログイン後にコピー

を追加することです。エンコーディングは統一されたままなので、トランスコードする必要はありません

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

    iconv 関数を使用すると、次の問題を解決できます。アップロード時に中国語のファイル名が文字化けする実際、iconv はエンコーディングの不一致によって引き起こされるさまざまなコード文字化けの問題を解決できます。
  1. iconv 関数を使用する場合、ソース文字列のエンコーディングがまだ決まっていない場合は、まずソース文字列のエンコーディングを確認してください。
  2. すべてのコードのエンコードが
  3. 一貫していることを確認し、iconv 関数は最後の手段としてのみ使用してください。
  4. サーバーに保存するファイル名に中国語のファイル名を使用しないようにしてください。ファイル名は自分のファイル名に変換してください(英語のファイル名であっても、変換してください)。

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