中文字符相关问题

时间:2022-05-06 08:12:36

编码综述:

     php并不是采用什么编码的问题, 而是你要输出的编码问题你把php写成u8/gb2312它都可以正常使用, 区别在于, 在chr里得到的是什么, chr虽然可以返回一个编码大于127的字符, 但是这并不意味着php可以正常解析u8/gb2312, 一个汉字在GB2312中由两个字节组成, 也就是FFFF, 而在u8里是FFFFFF, 而chr只拿到了第一个FF, 也就是255, 它并不能直接得到任何汉字的直接编码而实际上ASCII和GB2312是兼容的, 这也是为什么chr可以正常取值的原因, 因为chr并不是为了可录入的字符串取值的, 它可以安全用于任何的二进制编码, 包括图像文件给你个例子你看看echo ord('我');这里只能返回230, 我是以u8保存的文件并输出的, 它得到的只有230, 而230转换成hex是E6,实际上u8中我的编码是E68891, 这样你就明白了吧, 其实它只拿到了第一个字节echo chr(0xE6).chr(0x88).chr(0x91);这里例子可以在u8的情况下输出我这个汉字, 你看到了, 这里用了3次chr才得到这个汉字。

 

1.匹配出中文字符
案例:(文件编码为gbk)

<?php
$str = "你好,hel哈哈lo";
$dd=preg_match_all('/[\x80-\xff]./',$str,$match);
var_dump($match);
?>

输出:array(1) { [0]=> array(4) { [0]=> string(2) "你" [1]=> string(2) "好" [2]=> string(2) "哈" [3]=> string(2) "哈" } }
注解:1.因为gbk的中文是单字节存在,所以如果文件编码使用gbk,那么可以用[\x80-\xff].来匹配;
        2.因为unicode是双字节形式存在,所以如果文件编码为unicode,那么就要用'/[\x{4e00}-\x{9fff}]/u'来匹配(使用4位16进制时必须要加"{}"和模式修正符"u")。