天下网吧 >> 网吧天地 >> 天下码农 >> 后端开发 >> PHP >> 正文

比较好用的判断是否GB2313编码字符串的PHP源码

需求:

判断前端发过来的字符串是否GB2313编码的字符串。

因为不同的平台(macOS,安卓,iOS前端都有),发送过来的字符串编码不一样。都使用系统默认的编码。

所以要判断服务端接收到的字符串编码是UTF-8还是GB2312

解决过程:

网上查询了多个PHP源码,关于拍判断字符串是否GB2313编码的。包括下面两种方法:

static function is_gb2312($str)
{
	for ($i = 0; $i < strlen($str); $i++) {
		$v = ord($str[$i]);
		if ($v > 127) {
			if (($v >= 228) && ($v <= 233)) {
				if (($i + 2) >= (strlen($str) - 1)) return true; // not enough characters
				$v1 = ord($str[$i + 1]);
				$v2 = ord($str[$i + 2]);
				if (($v1 >= 128) && ($v1 <= 191) && ($v2 >= 128) && ($v2 <= 191)) // utf编码
					return false;
				else
					return true;
			}
		}
	}
	return true;
}
static function utf8_gb2312($str, $default = 'gb2312')
{
	$str = preg_replace("/[\x01-\x7F]+/", "", $str);
	if (empty($str)) return $default;

	$preg = array(
		"gb2312" => "/^([\xA1-\xF7][\xA0-\xFE])+$/", //正则判断是否是gb2312
		"utf-8" => "/^[\x{4E00}-\x{9FA5}]+$/u",   //正则判断是否是汉字(utf8编码的条件了),这个范围实际上已经包含了繁体中文字了
	);

	if ($default == 'gb2312') {
		$option = 'utf-8';
	} else {
		$option = 'gb2312';
	}

	if (!preg_match($preg[$default], $str)) {
		return $option;
	}
	$str = @iconv($default, $option, $str);

	//不能转成 $option, 说明原来的不是 $default
	if (empty($str)) {
		return $option;
	}
	return $default;
}

发现部分字符串能正常识别,部分字符串识别不出来,明明是GB2312编码的,识别成不是GB2312编码的。

最终解决方法:

最后找到一个比较完美的判断是否GB2312编码的函数,如下:

static function isgb2312str($str)
{
	$len = strlen($str);
	for ($i = 0; $i < $len; $i++) {
		$c1 = substr($str, $i, 1);
		if (ord($c1) <= 0x7F) continue;
		$flag1 = ord($c1) >= 0xA1 && ord($c1) <= 0xFE;
		if (!$flag1 || $i == $len - 1) return false;
		$c2 = substr($str, $i + 1, 1);
		$flag2 = ord($c2) >= 0xA1 || ord($c2) <= 0xFE;
		if (!$flag2) return false;
		$i++;
	}

	return true;
}

识别效果:

本文来源:天下网吧 作者:天下码农

声明
声明:本站所发表的文章、评论及图片仅代表作者本人观点,与本站立场无关。若文章侵犯了您的相关权益,请及时与我们联系,我们会及时处理,感谢您对本站的支持!联系Email:[email protected],系统开号,技术支持,服务联系QQ:1175525021本站所有有注明来源为天下网吧或天下网吧论坛的原创作品,各位转载时请注明来源链接!
天下网吧·网吧天下
  • 本周热门
  • 本月热门
  • 阅读排行