0

アップロード時にファイル名を台無しにするバグが PHP に存在します - http://bugs.php.net/bug.php?id=47096を参照してください。したがって、ファイル名を適切な UTF8 に変換する関数を使用しています。

関数の中心は次のとおりです。

    if ( 'WIN' == substr( PHP_OS, 0, 3 ) ) {
            $codepage = 'Windows-' . trim( strstr( setlocale( LC_CTYPE, 0 ), '.' ), '.' );
            if ( function_exists( 'iconv' ) ) {
                    $filename = iconv( 'UTF-8', $codepage, $filename );
            } elseif ( function_exists( 'mb_convert_encoding' ) ) {
                    $filename = mb_convert_encoding( $filename, 'UTF-8', $codepage );
            }
    }        

これは、古い PHP バージョン (<5.2) では問題なく機能しました。ただし、最近の PHP バージョンでは、コマンド

setlocale( LC_CTYPE, 0 )

'C' を返します。これは明らかに Windows コード ページではないため、変換は失敗します。

PHP で現在の Windows コード ページを取得するための信頼できる方法または代替方法はありますか?

4

1 に答える 1

4

古いバージョンの PHP で動作したことは興味深いことです。ロケールを明示的に設定しない場合、戻り値 はC、ロケールが設定されておらず、デフォルトが使用されていることを示します。

これを呼び出しsetlocale( LC_CTYPE, '' )て、ロケールを明示的にデフォルトのシステム ロケールに設定することができます。空の文字列でメソッドを呼び出した場合の戻り値は、新しく設定されたロケールである必要があります (0 で呼び出して、ロケールがクエリされ、変更なしで返されることを期待するのとは対照的です)。

空の文字列は、単に照会するのではなく、現在のロケールを明示的にデフォルトに設定する方法です。

于 2012-12-09T14:50:14.457 に答える