当我像这样转换样本字符串时:
$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%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
但就是这样:
????????????????????? - ???????????????? - ???????? ?????????? - 8 - ????????????????????? - ?????????????? - ????????? - ????????????? - ????????????????????????? < / p>
我真的很困惑任何人都知道这个问题吗?
更新:我也试过iconv:
echo iconv("UTF-8", "ASCII", $str), PHP_EOL;
但它说:
注意:iconv():检测到输入字符串中的非法字符
答案 0 :(得分:3)
%D8不是ascii编码。 Ascii有127个(如果使用扩展名,则为255个)(见http://www.asciitable.com/)
因此,像Ø这样的特殊字符没有等价物。 <{1}}通过用?替换它们来处理它,而mb_convert_encoding
会抛出错误。
你所看到的输出看起来更像是url编码。 试试这个:
iconv
答案 1 :(得分:0)
在我看来,这种情况的问题是输入字符串错误,并且不需要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);
}
}
我终于发现一些看似相似但不相等的值。我对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);
然后我们得到$out
值。
结论是在这种情况下,ASCII和UTF-8之间的转换显然是不必要的,并且输入字符串可能是错误的(可能是因为从UTF-8到我无法识别的某些不必要的约束)。