php utf-8 中的西里尔字母到 windows-1252

问题描述 投票:0回答:1

在线解码器 https://2cyr.com/decode/?lang=en 有些网址以西里尔文进入我的网站,有些链接编码不正确,可能在站点地图中或被搜索机器人抓取时,这是我唯一知道的是应该出现西里尔字母并且需要对其进行解码以进行 301 重定向。大多数都使用

iconv('UTF-8', 'Windows-1252', urldecode($text))
iconv('UTF-8', 'ISO-8859-1', urldecode($text))
成功转换。但有些(例如%C3%90%C5%93%C3%90%C2%B8%C3%90%C2%BA%C3%91%C6%92%C3%91%E2%82%AC%C3%91 %C6%92%20%C3%90%C2%90%C3%91%C2%81%C3%90%C2%B0%C3%91%E2%80%A6%C3%90%C2%B8%C3 %90%C2%BD%C3%90%C2%B0) 返回 false。在在线解码器的帮助下,我发现
iconv('UTF-8', 'Windows-1252', urldecode($text))
应该可以工作,但需要某种“x-esc-entities”后置过滤器。我只是不明白如何在php中实现它?

php iconv urldecode
1个回答
0
投票

这很棘手,但我设法让它发挥作用:

$text = '%C3%90%C5%93%C3%90%C2%B8%C3%90%C2%BA%C3%91%C6%92%C3%91%E2%82%AC%C3%91%C6%92%20%C3%90%C2%90%C3%91%C2%81%C3%90%C2%B0%C3%91%E2%80%A6%C3%90%C2%B8%C3%90%C2%BD%C3%90%C2%B0';
$out = '';
$ucs = iconv('UTF-8', 'UCS-2BE', urldecode($text));
foreach(str_split($ucs, 2) as $c)
{
    if($c>="\x00\x80" && $c<="\x00\x9F")
        $out .= $c[1];
    else
        $out .= iconv('UCS-2BE', 'windows-1252', $c);
}
echo $out;

输出:

Микуру Асахина
© www.soinside.com 2019 - 2024. All rights reserved.