PHP統計UTF 8編碼檔案中的字元數

2021-09-26 03:18:16 字數 2506 閱讀 2256

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...