ホームページ  >  記事  >  バックエンド開発  >  PHP 5.3 には奇妙なエラーが 2 つあります。専門家がそれらに答えてくれることを願っています。

PHP 5.3 には奇妙なエラーが 2 つあります。専門家がそれらに答えてくれることを願っています。

WBOY
WBOYオリジナル
2016-06-23 13:39:32981ブラウズ

1 テスト環境

CentOS 6 + PHP 5.3.3、2015 年 2 月 26 日、yum を通じて最新の状態に更新されました。

2 エラーの説明

2.1 Basename() 関数は、UTF-8 でエンコードされたパスに対して誤った結果を返します。

これを確認するのは非常に簡単です。次の内容で UTF-8 でエンコードされた php ソース ファイル test.php を作成します。

<?php$utf8Dir = '/var/www/html/小猫b.txt';echo basename($utf8Dir); echo '<br/>';$utf8Dir = '/var/www/html/a小猫b.txt';echo basename($utf8Dir); echo '<br/>';$utf8Dir = '/var/www/html/ab.txt';echo basename($utf8Dir); echo '<br/>';

ブラウザを使用してアクセスすると、ページは次のように表示されます。


b.txt
a小猫b .txt
ab.txt


名前がASCIIコードで始まらない場合、ASCII文字が見つかるまで中国語の文字は破棄されることがわかります。さらに、dirname() にはこの問題はありません。

2.2 ZipArchive::extractTo() にも同じ問題があります。

.zip パッケージ内のファイルが純粋な ASCII でない場合、ファイル内の中国語の文字も破棄されます。ただし、ファイルは解凍されましたが、解凍されたファイル名が間違っていました。ファイル名がすべて漢字の場合、解凍後にすべてのファイル名が破棄され、. と拡張子の部分だけが残り、隠しファイルになります。

例: Kitten.txt は解凍後 .txt になります。


個人的には、問題のある関数basename()がこのメソッド内で呼び出されており、それがこの問題を引き起こしていると感じています。


2.3 奇妙なこと

上記の 2 つの問題は、php プログラムをローカルで実行する場合には存在しません。つまり、PHP エンジンが配置されているホスト上でコマンドライン php test.php から実行すると、上記の 2 つの問題は発生しなくなります。結局これはなぜでしょうか?私の個人的な推測では、basename() は内部的に

特定の環境変数に依存しており、Web ページを通じてアクセスすると、これらの変数が正しく設定されず、問題が発生するのではないかと考えています。理由は何ですか?専門家の方、お答えください。 。 。 (私は一日落ち込んでいます。誰かがそれを説明してくれることを願っています)

3 対処方法

問題が見つかっただけで問題の本当の原因が分からないため、直接解決することはできません。私の対策は、これら 2 つの関数を使用しないようにし、それらの関数が必要な場合は、同様の関数を自分で作成することです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。