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)

在此处输入图像描述

在解析拉丁名称(或例如)时转换为?,或简单地变为nullGeração

在此处输入图像描述


那么,如何使用不同类型的语言正确解析文件名/路径?标题字符集没有帮助。

信息:

XAMPP 与 Apache2 + PHP 5.4.2 在 Win7 x86


更新#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();
?>

如果我使用HTML-ENTITIES而不是utf-8on mb_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 回答
1

在这种情况下,您使用的操作系统可能很重要:

请参考这个问题:为什么 Windows 需要 `utf8_decode` 文件名才能使 `file_get_contents` 工作?

我认为这可能是相关的,因为屏幕截图看起来非常微软化。

于 2013-11-18T15:09:34.373 回答
0

匹配任何字母/数字

\p{L}\p{N}

于 2013-11-19T12:55:57.580 回答