PHP函数in_array无法识别变音符号

时间:2018-09-16 06:05:33

标签: php arrays image diacritics scandir

我有一个贯穿文件并获取所有图像的代码。

$img = '/srv/www/wordpress-default/public_html/wp-content/uploads/2018/07/2018_07_DogOwner_VS_CatOwner_655x368_NL-500x281.jpg';
$dir = preg_replace('#[^/]*$#', '', $img); 
$image_files = scandir($dir); 
$image_name = @array_pop(explode('/', $img));
$find = $image_name;
var_dump(in_array($find, $image_files)); 

在此示例中,我仅运行一张图像。此代码返回true。问题是当我有一个带有德国标志的图像时(hundezubehör-für-sommer.jpg)。

$img = '/srv/www/wordpress-default/public_html/wp-content/uploads/2018/07/hundezubehör-für-sommer.jpg';

这将返回false。任何想法为什么这不起作用?

编辑: 我几天前问了这个问题:How to find a shortest name (string) of the same image with different naming。解决方案在这里:https://3v4l.org/T7lfU。我认为的问题是,当我从scandir运行代码时,它找不到变音符号。

2 个答案:

答案 0 :(得分:4)

rails s函数在字符串字母的情况下仍然有效。我接受这个问题是因为您的PHP文件和文件系统使用了不同的编码,因此in_array读取的值具有另一种编码,因此它不同于代码中编写的scandir值。

尝试转换$img结果的编码,使其与PHP文件编码匹配。例如:

scandir

用PHP文件编码替换// ... $image_files = scandir($dir); foreach ($image_files as &$file) { $file = mb_convert_encoding($file, 'UTF-8', 'Windows-1251'); } // ... var_dump(in_array($find, $image_files)); ,并用文件系统编码替换UTF-8

答案 1 :(得分:0)

问题在于将öü之类的多字节字符存储到PHP文件中。

您可以尝试将字符串解释为多字节:

$img = utf8_encode('/srv/www/wordpress-default/public_html/wp-content/uploads/2018/07/hundezubehör-für-sommer.jpg');

编码,然后解码以使其更安全:

$img = html_entity_decode('/srv/www/wordpress-default/public_html/wp-content/uploads/2018/07/hundezubehör-für-sommer.jpg');

或反斜杠实体:

$img = "/srv/www/wordpress-default/public_html/wp-content/uploads/2018/07/hundezubeh\303\266r-f\303\274r-sommer.jpg";