zhangjingyu
真正的通用函数(全场景)/**
* 万能编码转换器
* @param mixed $data 要转换的数据(字符串或数组)
* @param string $to 目标编码
* @param string|array $from 源编码(自动检测)
* @return mixed 转换后的数据
*/
function universalConvert($data, $to = 'UTF-8', $from = null) {
// 如果是数组,递归处理
if (is_array($data)) {
foreach ($data as $key => $value) {
$data[$key] = universalConvert($value, $to, $from);
}
return $data;
}
// 非字符串直接返回
if (!is_string($data)) {
return $data;
}
// 空字符串直接返回
if (empty($data)) {
return $data;
}
// 指定源编码
if ($from) {
$result = @mb_convert_encoding($data, $to, $from);
if ($result && $result != $data) {
return $result;
}
}
// 自动检测(按优先级)
$encodings = ['UTF-8', 'GBK', 'GB2312', 'GB18030', 'BIG5', 'latin1'];
foreach ($encodings as $encoding) {
if ($encoding === $to) continue;
$result = @mb_convert_encoding($data, $to, $encoding);
if ($result && $result != $data) {
// 双重验证
$back = @mb_convert_encoding($result, $encoding, $to);
if ($back == $data) {
return $result;
}
}
}
// 强制转换(忽略错误)
$result = @mb_convert_encoding($data, $to, 'auto');
return $result ?: $data;
}使用示例
读取数据:
// 原来
$row['aname'] = convertToUtf8($row['aname']);
// 通用版
$row['aname'] = universalConvert($row['aname'], 'UTF-8', 'GBK');
写入数据:
// 用户提交的数据转成数据库编码
$title = $_POST['title'];
$title_db = universalConvert($title, 'GBK', 'UTF-8');
处理整个数组:
// 一次性转换所有字段
$row = universalConvert($row, 'UTF-8', 'GBK');

