php 檢測(cè)字符編碼代碼
來(lái)源:程序員人生 發(fā)布時(shí)間:2014-01-28 06:33:26 閱讀次數(shù):3886次
- function utf8_gb2312($str, $default = 'gb2312')
- {
- $str = preg_replace("/[x01-x7f]+/", "", $str);
- if (emptyempty($str)) return $default;
-
- $preg = array(
- "gb2312" => "/^([xa1-xf7][xa0-xfe])+$/",
- "utf-8" => "/^[x{4e00}-x{9fa5}]+$/u",
- );
- if ($default == 'gb2312') {
- $option = 'utf-8';
- } else {
- $option = 'gb2312';
- }
- if (!preg_match($preg[$default], $str)) {
- return $option;
- }
- $str = @iconv($default, $option, $str);
-
-
- if (emptyempty($str)) {
- return $option;
- }
默認(rèn)編碼是gb2312,而且我統(tǒng)計(jì)了一下,90%的情況下都是gb2312,所以,我的檢測(cè)函數(shù)不能出現(xiàn)本來(lái)是gb2312的,結(jié)果被檢測(cè)出utf8. 基本思路是:
1. 把所有的ascii去掉,如果全部都是ascii,那么就是gb2312。
2. 假設(shè)這個(gè)字符串是gb2312,用一個(gè)正則檢查它是否是真的gb2312,如果不是,那么就是utf-8
3. 然后,用iconv 把字符串轉(zhuǎn)換成utf8,如果轉(zhuǎn)換不成功,那么原來(lái)可能不是真正的一個(gè)gb2312編碼的字符(用正則匹配我已經(jīng)盡量精確,但是,gb2312的編碼不是連續(xù)的,還是會(huì)有空洞),那么最后的編碼就是utf-8.
4. 否則就是gb2312 編碼:加入這樣的檢查功能后,在1000個(gè)關(guān)鍵字里面,就出現(xiàn)了1個(gè)亂碼,比以前的近100個(gè)關(guān)鍵字亂碼少了很多。
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)