PHP は回避策によってシステムのフォルダー パス エンコーディングを検出します
最近、私は PHP を使用して ftp に似た Web-ftp プラットフォームを作成しています。
Linux およびウィンドウ パス アクセスと互換性がある必要があります。
そのプロセス中, window と Linux で使用されるパスのエンコーディングが異なることがわかりました。たとえば、linux は utf-8 であるようですが、
php のエンコーディングはパスに中国語が含まれている場合は utf-8 を使用します。パスにアクセスするための utf-8 エンコーディング。 file_exists などの fs メソッドにアクセスできない場合があります。
パスが存在しないため、utf-8 が gbk 形式に従ってパス エンコーディングを解析するためです。中国語は別の文字になっているはずです。パスが表示されます。
このとき、現在のシステムのエンコーディングを自動的に検出する必要があります。 Google で検索しましたが、PHP に組み込まれているシステム エンコーディングを検出する効果的な方法が見つかりませんでした。
考えた後、次の解決策を使用して解決しました: Linux と Windows での現在のテストは正しいです。
```php
// utf8 エンコーディングを現在のシステム エンコーディングに変換します
protected static function _toOsCode($str, $coding = null) {
$enc = 'UTF-8';
if (empty($coding)) {
return $str;
}
//システム エンコーディングを検出します
//現時点では適切な方法が見つかりません。唯一の方法は、中国語のファイルを配置し、検出のために別のエンコーディングを再利用することです。エンコーディングは正しいです
protected static function _detectOsCode() {
$codingFile = '/coding-encoding-os-path.html';
$detectPath = __DIR__ .$codingFile;
$allCoding = mb_list_encodings ();
foreach ($allCoding as $coding) {
if (false !==tripos('|byte2be|byte2le|byte4be|byte4le|UCS-4|UCS -4BE|UCS-4LE|UCS- 2|UCS-2BE|UCS-2LE|UTF-32|UTF-32BE|UTF-32LE|UTF-16|UTF-16BE|UTF-16LE|', '|'.$ コーディング。'|')) {/ /一部のエンコーディングは不正なパスに変換されるため、検出する必要はありません
$coding);
} }
if (empty(self::$osPathEncoding)) {
self::_httpCode('システム パス ファイル (フォルダー) 名のエンコーディングの検出に失敗しました。考えられる理由の 1 つは '.$codingFile です。'ファイルは削除されているか、読み取り権限がありません', 500);