php - 删除双字符编码
问题描述
使用带有array_walk_recursive()的函数strtr()或str_ireplace()或preg_replace( ) ,我尝试删除多维数组中的错误字符编码,数据以 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"]]
解决方案
问题来自 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);
}
或者
或利用 UTF-16BE(大端)和 Unicode 代码点之间的直接映射:
echo mb_convert_encoding("\x10\x00", 'UTF-8', 'UTF-16BE');
推荐阅读
- excel - 如何在 Excel 中使用起始编号和结束编号在 Excel 中创建一列数字?
- python - CNN 模型没有考虑训练数据集中的所有数据,而是只考虑部分数据,我在所有时期都得到完全相同的准确度
- css - 身高:100% 不被继承
- oracle - SQL Developer:PLSCOPE_SETTINGS“无”和“全部”之间的区别?
- function - 为什么 Lua 表达式中没有匿名函数?
- android - 实施 Google Assistant 语音命令支持
- python - 如何在句子中颠倒位置?
- javascript - 我的节点 js 代码对关键字“require”没有影响
- html - 如何制作嵌入式视频的直接下载链接
- asp.net-core - 将“ui_locale”返回给客户端