如果文件的編碼採用utf8格式,且在文件的開頭寫入了UTF8 BOM(即第一到第三個字符的十六進制分別是EF BB BF,用UltraEdit打開切換到十六進制可以看到),則可以通過下面的isUtf8函數判斷文件本身的編碼。
function isUtf8($file) {
$content = file_get_contents($file);
$charset[1] = substr($content, 0, 1);
$charset[2] = substr($content, 1, 1);
$charset[3] = substr($content, 2, 1);
if (ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191){
return true;
} else {
return false;
}
}
var_dump(isUtf8('test2.php'));
如果某個文件本身是UTF8編碼,但是前面三個字符不是EF BB BF,則表示沒有寫入BOM。例如我打開某個UTF8編碼的文件前面三個字符分別是3C 3F 70,實際上是<?p三個字符,具體可以看ascii table。
判斷中文和編碼有關,gbk是雙字節,utf8是三字節,可以根據中文的範圍來判斷。
編碼範圍
1. GBK (GB2312/GB18030)
\x00-\xff GBK雙字節編碼範圍
\x20-\x7f ASCII
\xa1-\xff 中文
\x80-\xff 中文
2. UTF-8 (Unicode)
\u4e00-\u9fa5 (中文)
\x3130-\x318F (韓文
\xAC00-\xD7A3 (韓文)
\u0800-\u4e00 (日文)
if(preg_match('/[\x{4e00}-\x{9fa5}]/u',$str)==1)
{
echo "含有中文字符\n";
}
假設某個文件前面三個字符不是EF BB BF,而文件本身的編碼不確認,你的系統的數據庫編碼是UTF8,爲了保證將此文件中的數據導入到數據庫後不亂碼,則需要作一下判斷,如果文件中的中文是UTF8編碼,則不需要進行編碼轉換,否則需要進行編碼轉換。
下面做個測試
文件本身是utf-8編碼的。
<?php
$str = 'utf8編碼的漢字測試';
if (preg_match('/[\x{4e00}-\x{9fa5}]/u', $str) == 1) {
echo "含有UTF8編碼的中文字符\n";
} else {
echo "不含有UTF8編碼的中文字符\n";
}
?>
輸出:
含有UTF8編碼的中文字符
<?php
$str = 'utf8編碼的漢字測試';
$str = iconv('UTF-8', 'GBK', $str);
if (preg_match('/[\x{4e00}-\x{9fa5}]/u', $str) == 1) {
echo "含有UTF8編碼的中文字符\n";
} else {
echo "不含有UTF8編碼的中文字符\n";
}
?>
輸出:
不含有UTF8編碼的中文字符
PHP開發中編碼那點事
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
MongoDB之PHP的使用(GridFs)
爱在拜城_sunbea
2018-08-27 20:02:39
mongodb php之limit查詢技巧
爱在拜城_sunbea
2018-08-27 20:02:03
使用WampServer搭建本地PHP環境,綁定域名,配置僞靜態
stoneson
2018-08-27 19:48:49
關於下載PHP時候遇到的分類
zcy6675
2018-08-27 19:48:04
微信網頁開發常用功能封裝
m249005779
2018-08-27 19:47:09
ThinkPHP微信JSSDK的使用
m249005779
2018-08-27 19:47:09
composer
m249005779
2018-08-27 19:47:09
在homestead下創建laravel/lumen項目
雅希
2018-08-27 19:45:07
Windows下安裝homestead常見問題詳解
雅希
2018-08-27 19:45:04
小白學習laravel/lumen(一)前言
雅希
2018-08-27 19:45:04
Visual Studio《加載此屬性頁時出錯》的解決辦法[轉]
lesen
2018-08-27 19:44:39
通過WMI獲取主板信息
lesen
2018-08-27 19:44:37