$filename= $list->filename; // 获取文件名字 if(preg_match("/[\x80-\xff]/",$filename)){ // 如果是中文,将其转码 $fileName=iconv("utf-8","gb2312",$filename); }else{ $fileName = $filename; // 否则保存原文件名 }
GB2312(GBK)为了和 ASCII 兼容,使用了最高位为 1
的编码方式。
你给出的链接是扩展的 ASCII 码表,标准的 ASCII 码表共 127 个字符,01 - 7F。
0000 0001
0000 0010
...
...
...
0111 1111
而 GBK 为了不和 ASCII 混淆,使用最高位的 1
来编码,占 2 个字节。这样,当进行编码解析的时候就简单的,如果遇到
-
最高位如果是
0
那么就是 ASCII 码。 -
如果最高位是
1
那就在继续读取下一个字节。- 如果下一个字节最高位是
0
,乱码。 - 如果下一个字节最高位是
1
,则这两个字节对于一个汉字。
- 如果下一个字节最高位是
因此,简单的匹配汉字的规则就是 [\x80-\xff]
。