判断内容里有没有中文,然后要返回中文字符 首先,我用preg_match_all('/[\x80-\xff]./', $s,$arr);检测是否有中文字符,然后打印出$arr,查看中文字符有哪些,再对应修改,但是打印$arr都是乱码,用了几种GB2312转UTF-8的方法都不行。各位帮忙提供一些方法。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你是要判断汉字还是不理会编码只判断GBK内汉字的情况呢?因为对后者来说,GBK / Shift-JIS / EUC-KR(中日韩)……内码都是相同的,这样不考虑其他编码才能成立unicode的汉字范围是 基础字符:4E00-9FCFExtendsion A: 3400-4DBF 这个还在基础部分的前面,要留意Extendsion B: 20000-2A6D6Extendsion C: 2A700-2B734Extendsion D: 2B740-2B81D其他:31A0-31BA 还有……请去unicode官网查询 1、utf-8 是这样编码的:U+007F 0xxxxxxxU+07FF 110xxxxx 10xxxxxxU+FFFF 1110xxxx 10xxxxxx 10xxxxxxU+1FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxxU+3FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxxU+7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx2、由此可知中文的正则表达式规则串为/^(?:[\x00-\x7f]|[\xc0-\xff][\x80-\xbf]+)+$/3、手册中附录了这样的函数function is_utf8($str) { $c=0; $b=0; $bits=0; $len=strlen($str); for($i=0; $i<$len; $i++){ $c=ord($str[$i]); if($c > 128){ if(($c >= 254)) return false; elseif($c >= 252) $bits=6; elseif($c >= 248) $bits=5; elseif($c >= 240) $bits=4; elseif($c >= 224) $bits=3; elseif($c >= 192) $bits=2; else return false; if(($i+$bits) > $len) return false; while($bits > 1){ $i++; $b=ord($str[$i]); if($b < 128 || $b > 191) return false; $bits--; } } } return true;}4、从 php5.3 起, mb_string 扩展提供了 mb_check_encoding 函数if(mb_check_encoding($s, 'utf-8')) echo 'yes'; 由 preg_match_all('/^(?:[\x00-\x7f]|[\xc0-\xff][\x80-\xbf]+)+$/', $s,$arr);只是返回有中文字符的那段文字,不能说具体哪个是中文字符 我不是让你把这些发给客户看,是给你个思路,你就可以根据范围正则提取汉字显示了例如 [\u4e00-\u9fcf],都习惯了让人家写好代码给你用么?看来我的思想过时了 如果你要逐个汉字输出的话,就用基于unicode字串的preg_filter()和preg_split(),拆开单个字符判断 Example #2 将一个字符串分隔为组成它的字符 <?php$str = 'string';$chars = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY);print_r($chars);?> 我用这个匹配preg_match_all('/[\x80-\xff]./', $s,$arr);是可以找到某段话是否有中文字符,只是返回的值print_r($arr); 是乱码了。 打印出来是这个 Array ( [0] => Array ( [0] => � ) ) 启发你这么多次都没有效果,不再纠结这个了这样说,你的判断把范围扩大了,"."包含传换行符以外的字符在不指定编码时——preg函数本身就无编码的概念,就有可能把GBK汉字后半部分和另一个字符(ASCII或者后面一个汉字的前半部分)判断出来了,这就是乱码了,说白了就是判断错了判断汉字要么用版主的程序,要么转unicode整字匹配\u4e00就是整字匹配另一种方法是先用iconv() 从GBK->utf-8,然后用$chars = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY);也是整字拆分的,不会从汉字中间拆开,然后对数组$chars逐个检查或者准备一个ASCII字符的数组,和$chars求差集,也能得到相对较好的结果再不明白我也没办法了 PHPcms后台无法登陆这么回事啊,谢谢啦, 关于__set()的问题 SEO优化要注意的事项 写了一段时间的代码,发现自己悲剧的逃不出这定律。。 求替换一个 为什么我启动mysqld.exe后。黑色屏幕不能输入任何东西呢? sql关于相同父ID最多取3记录 非常非常奇怪的问题!php+mysql 怎样得到循环的两个相邻的数值的差 php 关于session的警告 关于安全性的一些疑问 PHP session 的奇怪规则
基础字符:4E00-9FCF
Extendsion A: 3400-4DBF 这个还在基础部分的前面,要留意
Extendsion B: 20000-2A6D6
Extendsion C: 2A700-2B734
Extendsion D: 2B740-2B81D其他:
31A0-31BA 还有……请去unicode官网查询
U+007F 0xxxxxxx
U+07FF 110xxxxx 10xxxxxx
U+FFFF 1110xxxx 10xxxxxx 10xxxxxx
U+1FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U+3FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U+7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx2、由此可知中文的正则表达式规则串为
/^(?:[\x00-\x7f]|[\xc0-\xff][\x80-\xbf]+)+$/3、手册中附录了这样的函数
function is_utf8($str) {
$c=0; $b=0;
$bits=0;
$len=strlen($str);
for($i=0; $i<$len; $i++){
$c=ord($str[$i]);
if($c > 128){
if(($c >= 254)) return false;
elseif($c >= 252) $bits=6;
elseif($c >= 248) $bits=5;
elseif($c >= 240) $bits=4;
elseif($c >= 224) $bits=3;
elseif($c >= 192) $bits=2;
else return false;
if(($i+$bits) > $len) return false;
while($bits > 1){
$i++;
$b=ord($str[$i]);
if($b < 128 || $b > 191) return false;
$bits--;
}
}
}
return true;
}4、从 php5.3 起, mb_string 扩展提供了 mb_check_encoding 函数
if(mb_check_encoding($s, 'utf-8')) echo 'yes';
由 preg_match_all('/^(?:[\x00-\x7f]|[\xc0-\xff][\x80-\xbf]+)+$/', $s,$arr);
只是返回有中文字符的那段文字,不能说具体哪个是中文字符
例如 [\u4e00-\u9fcf],都习惯了让人家写好代码给你用么?看来我的思想过时了
<?php
$str = 'string';
$chars = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY);
print_r($chars);
?>
我用这个匹配preg_match_all('/[\x80-\xff]./', $s,$arr);是可以找到某段话是否有中文字符,只是返回的值print_r($arr); 是乱码了。
打印出来是这个 Array ( [0] => Array ( [0] => � ) )
在不指定编码时——preg函数本身就无编码的概念,就有可能把GBK汉字后半部分和另一个字符(ASCII或者后面一个汉字的前半部分)判断出来了,这就是乱码了,说白了就是判断错了判断汉字要么用版主的程序,要么转unicode整字匹配
\u4e00就是整字匹配另一种方法是先用iconv() 从GBK->utf-8,然后用
$chars = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY);
也是整字拆分的,不会从汉字中间拆开,然后对数组$chars逐个检查
或者准备一个ASCII字符的数组,和$chars求差集,也能得到相对较好的结果再不明白我也没办法了