0

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

$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-?????????????????????-???????????????-??? ??????-????????????-???????????????????????????

我真的很困惑有人知道这个问题吗?

更新:我也试过 iconv:

echo iconv("UTF-8", "ASCII", $str), PHP_EOL;

但它说:

注意:iconv():在输入字符串中检测到非法字符

4

2 回答 2

3

%D8 不是 ascii 编码。Ascii 有 127 个(如果您使用扩展,则为 255 个)字符(请参阅http://www.asciitable.com/

因此,像 Ø 这样的特殊字符没有等价物。mb_convert_encoding通过用 ? 替换它们来处理这个问题,而iconv引发错误。

您所追求的输出看起来更像是 url 编码。尝试这个:

echo urlencode("اوقات-شرعی-جمعه-8-مرداد-ماه-به-اÙÙ‚-اردبیل");

于 2016-07-28T21:17:52.300 回答
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);
    }
}

我终于发现有些值看起来相似但不相等。我对原始文件做了同样的事情,$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 对我无法识别的东西进行了一些不必要的转换)。

于 2016-07-28T22:55:09.827 回答