PHP 在判断简体 / 繁体中文部份,以前是可以 Big5 / GB2312 / GBK 来判断(可以使用 mb_detect_encoding()),但是 UTF-8 后,就有点麻烦了。
PHP 判断 UTF-8 字符串是 简体 或 繁体中文
简体和繁体的 UTF-8 字码表是可以列的出来,不过会有一个字同时是简体和繁体的情况,要判断一个字符串是简体和繁体,这种判断法有点复杂。
想到比较偷懒的方式,就是在把 UTF-8 转换成 Big5 / CP950,再来比较看看字符串长度(文本字符串长度不同就代表不是繁体),虽然这个作法不是 100% 准确,但是应该够用了。
PHP 有下述两个 Function 是作编码转换的:
以往我都用 mb_convert_encoding() 来做转换,但是在此转换时,用这个转 CP950 UTF-8 这些在怎么互转,里面的编码都会帮我留存的很好,造成要去换算长度都是一
样的,所以改用 iconv()。
注:iconv() 需要搭配 //IGNORE
mb_convert_encoding() 与 iconv() 的文本长度范例
$strings = [
'微软软体',
'微软软件',
'今天天气真好',
];
foreach ($strings as $i => $s) {
echo $i . ' cp950: ' . mb_strlen(mb_convert_encoding($s, 'cp950', 'utf-8'), 'cp950') . "\n";
echo $i . ' cp950: ' . mb_strlen(iconv('UTF-8', 'cp950//IGNORE', $s), 'cp950') . "\n";
echo $i . ' cp950: ' . mb_strlen(mb_convert_encoding(mb_convert_encoding($s, 'cp950', 'utf-8'), 'UTF-8', 'cp950'), 'UTF-8') . "\n";
echo $i . ' utf-8: ' . mb_strlen($s, 'utf-8') . "\n";
}
?>
于上述测试,所以写下述两个 function 来判断简体与繁体
// 判断字符串是否是简体
function is_simplified($str)
{
$len = mb_strlen($str, 'utf-8');
return ($len != mb_strlen(iconv('UTF-8', 'cp950//IGNORE', $str), 'cp950')) ? true : false;
}
// 判断字符串是否是繁体
function is_traditional($str)
{
$len = mb_strlen($str, 'utf-8');
// gbk 包含 big5 内的字符,所以不能用 gbk
return ($len != mb_strlen(iconv('UTF-8', 'gb2312//IGNORE', $str), 'gb2312')) ? true : false;
}
?>
验证范例
$strings = [
'微软软体',
'微软软件',
'今天天气真好',
];
foreach ($strings as $i => $s) {
echo $s . "\n";
var_dump(is_simplified($s));
var_dump(is_traditional($s));
}
?>