在我看来,这种情况的问题在于输入字符串是错误的,ASCII 和 UTF-8 之间的转换是不必要的。
让我们从这个开始
$out = '%D8%A8%D8%B2%D8%B1%DA%AF-%D8%AA%D8%B1%DB%8C%D9%86-%D9%88%D8%B1%D8%B2%D8%B4%DA%A9%D8%A7%D8%B1%D8%A7%D9%86-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D8%A7%D9%84%D9%85%D9%BE%DB%8C%DA%A9%D8%AA%D8%B5%D8%A7%D9%88%DB%8C%D8%B1';
当我们尝试使用
echo mb_detect_encoding($out);
然后我们可以看到那当然是ASCII。但正如我们所看到的,这个字符串显然看起来像urlencode
函数的输出。让我们尝试使用一个urldecode
函数来检查该值的编码是什么
$decoded = urldecode($out);
echo mb_detect_encoding($decoded);
在输出中,我们可以看到这$decoded
是一个 UTF-8,因此尝试从问题中运行此代码
$str = "اوقات-شرعی-جمعه-8-مرداد-ماه-به-اÙÙ‚-اردبیل"
echo mb_convert_encoding($str, "ASCII");
没有意义,因为不能有 ASCII 编码。
我也很好奇$str
问题的编码是什么所以我准备了这样的东西来看看我是否可以$str
从价值中获得$decoded
价值
foreach (mb_list_encodings() as $chr) {
$test = mb_convert_encoding($decoded, $chr, 'UTF-8');
}
我很惊讶我没有找到任何可以给我类似$str
价值的编码。我已经尝试做更多并检查转换,就像在这段代码中一样
foreach (mb_list_encodings() as $chr) {
foreach (mb_list_encodings() as $chr2) {
$test = mb_convert_encoding($decoded, $chr, $chr2);
}
}
我终于发现有些值看起来相似但不相等。我对原始文件做了同样的事情,$str
但也没有成功(我没有从问题中得到请求输出)。
foreach (mb_list_encodings() as $chr) {
foreach (mb_list_encodings() as $chr2) {
//try with and without urlencode
$test = urlencode(mb_convert_encoding($str, $chr, $chr2));
}
}
当然,当我们这样做时
$newOutput = urlencode($decoded);
然后我们得到$out
值。
结论是,在这种情况下,ASCII 和 UTF-8 之间的转换显然是不必要的,并且输入字符串可能是错误的(可能是因为 UTF-8 对我无法识别的东西进行了一些不必要的转换)。