0

次のように、音楽ディレクトリを読み取って、jPlayer の JSON を設定しています。

<?php
//tried utf-8, shift_jis, etc. No difference
header('Content-Type: application/json; charset=SHIFT_JIS');

//cant be blank so i put . to make current file dir as base
$Directory = new RecursiveDirectoryIterator('.');
$Iterator = new RecursiveIteratorIterator($Directory);
$Regex = new RegexIterator($Iterator, '/^.+\.mp3$/i', RecursiveRegexIterator::GET_MATCH);
//instead of glob(*/*.mp3) because isnt recursive

$filesJson = [];

foreach ($Regex as $key => $value) {
    $whatever = str_ireplace(['.mp3','.\\'], '', $key);
    $filesJson['mp3'][] = [
        'title' => htmlspecialchars($whatever),
        'mp3' => $key
    ];

}
echo json_encode($filesJson);
exit();
?>

問題は、ファイル名が標準の UTF-8 ではないファイル (ラテン語、日本語、韓国語など) にあります。例:

日本

ここに画像の説明を入力

韓国語

ここに画像の説明を入力

ラテン語 (pt-br)

ここに画像の説明を入力

に変換されるか、ラテン語の名前を解析するときに?単になります (またはfor eg)nullGeração

ここに画像の説明を入力


では、さまざまな種類の言語でファイル名/パスを正しく解析するにはどうすればよいでしょうか? ヘッダーの文字セットは役に立ちません。

情報:

Win7 x86 で Apache2 + PHP 5.4.2 を使用する XAMPP


更新 #1:

@infinity の回答を試しましたが、変更はありません。まだ?JPでnull、ラテンで。

<?php
header('Content-Type: application/json; charset=UTF-8');
mb_internal_encoding('UTF-8');

$Directory = new RecursiveDirectoryIterator('.');
$Iterator = new RecursiveIteratorIterator($Directory);
$Regex = new RegexIterator($Iterator, '/^.+\.mp3$/i', RecursiveRegexIterator::GET_MATCH);

$filesJson = [];

foreach ($Regex as $key => $value) {
    $whatever = mb_substr($key, 2, mb_strlen($key)-6, "utf-8"); // 2 to remove .\ and -6 to remove .mp3 (-4 + -2)
    $filesJson['mp3'][] = [
        'title' => $whatever, //tried with and without htmlspecialchars
        'mp3' => $key
    ];

}
echo json_encode($filesJson);
exit();
?>

onHTML-ENTITIESの代わりに使用すると、ラテン文字は機能しますが、アジア人はまだ.utf-8mb_substr()?

4

4 に答える 4

1
<?php
header('Content-Type: application/json; charset=utf-8');
mb_internal_encoding('utf-8');

foreach ($Regex as $key => $value) {
    $whatever = mb_substr($key, 0, mb_strlen($str)-4, "utf-8");
    // ... rest of code
}
于 2013-11-12T17:08:39.153 に答える
1

dir() を使用した再帰的アプローチの短い試行:

myRecursiveScanDir($mypath);

function myRecursiveScanDir($path)
    $d = dir($path);
    while (false !== ($entry = $d->read())) {

       // Do something, ie just echo it
       echo $path."/".entry."<br/>";

       if(is_dir($path."/".entry))
           myRecursiveScanDir($path."/".entry);
    }
    $d->close();
)

ファイル拡張子やベース名を取得することも少し問題になる可能性があります。mb_substr、pathinfo、および basename がそのようなファイル名にどのように反応するかをデバッグおよびテストする必要がある場合があります。

于 2013-11-18T14:09:28.457 に答える
0

任意の文字/数字に一致する

\p{L}\p{N}

于 2013-11-19T12:55:57.580 に答える