将UTF-8转换为ASCII

时间:2016-07-28 20:32:41

标签: php encoding utf-8 mb-convert-encoding

当我像这样转换样本字符串时:

$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():检测到输入字符串中的非法字符

2 个答案:

答案 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到我无法识别的某些不必要的约束)。