将UTF-8转换为ASCII


Converting UTF-8 to ASCII

当我转换这样的示例字符串时:

$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_encoding0值的东西。我试着做更多的事情,并检查转换,就像在这个代码

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到我无法识别的东西进行了一些不必要的转换)。