当我转换这样的示例字符串时:
$str = "اوقات-شرعی-جمعه-8-مرداد-ماه-به-اÙÙ‚-اردبیل"
echo mb_convert_encoding($str, "ASCII");
从UTF-8到ASCII,结果应该是:
%D8%A8%D8%B2%D8%B1%DA%AF-%D8%AA%D8%B1%DB%8C%D9%86-%D9%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%A9%D9%D9%84%D9%85%D9%BE%DB%8dc%DA%A9%D8%AA%D8%B5%D8%A7%D9%88%DB%8C%D8%B1
但它是这样的:
-8-?????????????????????????
我真的很困惑有人知道这个问题吗?
更新:我也尝试了iconv:
echo iconv("UTF-8", "ASCII", $str), PHP_EOL;
但上面写着:
注意:iconv():在输入字符串中检测到非法字符
%D8不是ascii编码。Ascii有127个字符(如果使用扩展字符,则为255个)(请参阅http://www.asciitable.com/)
因此,像Å这样的特殊字符没有等价的字符。CCD_ 1通过将它们替换为?来处理此问题?,而CCD_ 2抛出错误。
您想要的输出看起来更像url编码。试试这个:
echo urlencode("اوقات-شرعی-جمعه-8-مرداد-ماه-به-اÙÙ‚-اردبیل");
在我看来,这种情况的问题是输入字符串错误,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
的编码是什么,所以我准备了这样的东西,看看我是否可以从$decoded
值中获得$str
值
foreach (mb_list_encodings() as $chr) {
$test = mb_convert_encoding($decoded, $chr, 'UTF-8');
}
我很惊讶,我没有发现任何编码可以给我类似于mb_convert_encoding
0值的东西。我试着做更多的事情,并检查转换,就像在这个代码
foreach (mb_list_encodings() as $chr) {
foreach (mb_list_encodings() as $chr2) {
$test = mb_convert_encoding($decoded, $chr, $chr2);
}
}
我终于发现一些值看起来相似但并不相等。我对oryginal $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);
则得到CCD_ 12值。
结论是,在这种情况下,ASCII和UTF-8之间的转换显然是不必要的,输入字符串可能是错误的(可能是因为从UTF-8到我无法识别的东西进行了一些不必要的转换)。