utf-8(8-bit unicode transformation format)是一種針對unicode的可變長度字元編碼,由ken thompson於2023年建立,現在已經標準化為rfc 3629。utf-8用1到4個位元組編碼unicode字元。
那如何判斷乙個字元到底是用幾個位元組表示的呢,這個從乙個utf-8字元的首位元組中就可以判斷,utf-8編碼規則:如果只有乙個位元組則其最高二進位制位為0;如果是多位元組,其第乙個位元組從最高位開始,連續的二進位制位值為1的個數決定了其編碼的位元組數,其餘各位元組均以10開頭。utf-8轉換表表示如下:
從檔案開頭通過每次讀取乙個字元的首位元組,判斷其中連續的1的個數就可以得知這個字元占用幾個位元組,如果最高位是0,則該字元是個單位元組字元(即ascii碼),然後跳過相應的位元組數,再去讀下乙個字元的首位元組,依此類推,就可以很容易的統計乙個檔案中的字元數了。
附上**:
<?php
class utf8counter
// 把檔案指標重新移到檔案開頭
rewind($fp);
return false;
}/**
* 根據utf-8字元首位元組確定該字元的位元組數
* @param string $char
* @return int|mixed
*/public static function getcharbytecount($char)
foreach (self::utf8_first_byte_feature as $bits => $bytecount)
}throw new \runtimeexception('非法的utf-8字元');
}/**
* @param $string
* @param null $absence 最後乙個字元缺少的位元組數,例如給定的字串最後乙個字元長度是3位元組,但只提供了其中前兩個位元組,則該值為1。
* @return int
*/public static function getstringcounter($string, &$absence = null)
while (true) );
$pos += $bytecount;
$counter++;
if ($pos >= $len)
}return $counter;
}/**
* @param string $file 檔案路徑
* @return int
*/public static function getfilecounter($file)
$fp = fopen($file, 'rb');
if (!$fp)
self::clearbomheader($fp);
$absence = 0;
while (!feof($fp))
if ($absence > 0)
$counter += self::getstringcounter($buf, $absence);
}@fclose($fp);
return $counter;
}/**
* 統計資料夾中所有檔案的字元數總和
* @param string $dir 目錄
* @param string|array $extname 只處理指定的副檔名,支援字串和陣列,'.txt' 或 ['.txt', '.php', '.html', '.md', ...]
* @return int
*/public static function getdircounter($dir, $extname = '')
$dir = rtrim($dir, "/\\");
if ($extname && is_string($extname))
$filearr = scandir($dir);
foreach ($filearr as $file)
$file = $dir . '/' . $file;
if (is_dir($file)) else }}
return $counter;}}
呼叫:
<?php
echo utf8counter::getstringcounter('????你好中國??') . php_eol;
echo utf8counter::getfilecounter('foo/1112.txt') . php_eol;
echo utf8counter::getdircounter('foo', '.txt') . php_eol;
執行結果:
c:\users\zhangyi\phpstormprojects\demo>php utf8wc.php109
34217
php使用fopen建立utf8編碼檔案的方法
一般來說,如果我們直接使用fopen建立會發現檔案編碼都不是uft 8的了,那麼如果要建立uft8檔案我們需要進行一些技術處理。具體步驟如下 使用php建立編碼格式為utf 8檔案的方法 第一步 新建乙個txt檔案,開啟,檔案 另存為 php,並將編碼改為utf 8,儲存。第二部 在php檔案中加入...
介紹utf8編碼
utf8並不算是一種電腦編碼,而是一種儲存和傳送的格式,如前所述,每個unicode ucs字元都以 2或4個bytes來儲存,看看以下的比較 以 i am chinese 為例 用ansi儲存 12 bytes 用unicode ucs2儲存 24 bytes 2 bytes header 用uc...
UTF8編碼 解碼
參考文件 rfc3629標準.對於任意乙個字,都可以用乙個唯一碼 unicode碼,由標準編制 表示,在應用過程中,需要對碼進行編碼.常用的編碼方式為utf 8.utf 8採用類似於ip位址分配的機制.即對於不同範圍的unicode碼,採用不同的模板進行編碼.流程概述為 2.1 查表獲取unicod...