【问题标题】:Remove double character encoding删除双字符编码
【发布时间】:2018-07-24 01:14:18
【问题描述】:

使用函数strtr()str_ireplace()preg_replace()array_walk_recursive(),我尝试删除多维数组中的错误字符编码,数据以UTF-8 编码并且来自Curl 查询。

我想通过只保留正确编码的重音字符来删除双重编码:

ã©école => école

Array
(
    [0] => Array
        (
            [0] => ã©cole
            [1] => Array
                (
                    [0] => ã©ecole al inara avenue 2 mars casablanca
                    [1] => ã©ecole 42
                    [2] => grande ã©école
                )
        )
)

使用 PHP 7.2.6 执行此操作时,我的代码出现错误,这是一种不好的方法吗?

致命错误:未捕获的 ArgumentCountError:参数太少 功能

function fix_utf8(&$value, $key)
{
    $char = array('é','É','è','ê','ë','Ã','à¢','ù','î','ô','ë','ö','ü','à»','ç','à§','Å“','’','…','Å“','–','«','»','‚');
    $value =  str_ireplace($char, '', $value);
}

$result = array_walk_recursive($result, 'fix_utf8');

print_r($result);

致命错误:未捕获的 ArgumentCountError:函数 fix_utf8() 的参数太少,传入了 1 个

function fix_utf8(&$value, $key)
{
    $char = array('é'=>'','É'=>'','è'=>'','ê'=>'','ë'=>'','Ã'=>'','à¢'=>'','ù'=>'','î'=>'','ô'=>'','ë'=>'','ö'=>'','ü'=>'','à»'=>'','ç'=>'','à§'=>'','Å“'=>'','’'=>'','…'=>'','Å“'=>'','–'=>'','«'=>'','»'=>'','‚'=>'');
    $value =  strtr(strtoupper($value), $char);
}

$result = array_walk_recursive($result, 'fix_utf8');

print_r($result);

function fix_utf8(&$value, $key)
{
    $char = array('/é/','/É/','/è/','/ê/','/ë/','/Ã/','/à¢/','/ù/','/î/','/ô/','/ë/','/ö/','/ü/','/à»//','//ç/','/à§/','/Å“/','/’/','/…/','/Å“/','/–/','/«/','/»/','/‚/');    

    $value =  preg_replace($char, '', $value);
}

$result = array_walk_recursive($result, 'fix_utf8');

print_r($result);

更新:

精度:CuRL 请求检索 JSON 格式并包含 Unicode 字符的内容

["école",["école d\u0027ingénieur"]]

【问题讨论】:

  • 删除“违规”字符弊大于利。正确解码,两次。

标签: php character-encoding


【解决方案1】:

使用 iconv_mime_decode(); PHP 预定义函数来删除这些字符

<?php
$str = "ã©cole ã©ecole al inara avenue 2 mars casablanca";
echo iconv_mime_decode($str);

DEMO

【讨论】:

    【解决方案2】:

    问题来自于 Windows 的 PHP 7.2.6 错误,json_decode() 函数无法正确转换 JSON 中包含的 Unicode 字符。

    解决方案:

    在 Debian 和 PHP 7.0.30 中,json_decode() 函数可以正常工作。

    您可以编写自己的函数来转换这些 Unicode 转义 序列:

    function unicodeString($str, $encoding=null) {
        if (is_null($encoding)) $encoding = ini_get('mbstring.internal_encoding');
        return preg_replace_callback('/\\\\u([0-9a-fA-F]{4})/u', function($match) use ($encoding) {
            return mb_convert_encoding(pack('H*', $match[1]), $encoding, 'UTF-16BE');
        }, $str);
    }
    

    Credit

    或使用 UTF-16BE(大端)和 Unicode 代码点:

    echo mb_convert_encoding("\x10\x00", 'UTF-8', 'UTF-16BE');
    

    Credit

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 2011-05-13
      • 2011-12-04
      • 2010-12-12
      • 2014-07-16
      • 1970-01-01
      相关资源
      最近更新 更多