檔案和字元編碼

NO IMAGE
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

轉載請註明來源:https://tlanyan.me/ascii-bina…

近期對識別檔案格式感到好奇,不幸和字元編碼搞混,不明其中原理導致心煩意亂。為了消除檔案格式和字元編碼的疑惑,上網搜尋並翻出以前收藏的文章,心結總算了卻。本文即是對檔案和字元編碼的個人總結。

文字檔案和二進位制

剛開始的疑惑是:文字檔案和二進位制檔案有什麼區別?為什麼一個能顯示內容,另一個的內容經常無法(用文字編輯器)正常顯示?

馬里蘭大學的這篇培訓筆記,把兩者的區別講得清楚:文字檔案是二進位制檔案的一種,底層儲存也是0和1;文字檔案可讀性和移植性好,但表現字元有限;二進位制檔案資料儲存緊湊,無字元編碼限制。文字檔案基本上只能存放數字、文字、標點等有限字元組成的內容;二進位制沒有字元約束,可隨意儲存影象、音視訊等資料。

用儲存數字的例子可以形象的看出文字檔案和二進位制檔案儲存內容上的差異。例如要儲存數字1234567890,文字檔案要儲存0-9這十個數字的ASCII碼,對應的十六進位制表示為:31 32 33 34 35 36 37 38 39 30

也可以寫出針對UTF-8編碼的strlen函式:

function myStrlen(string $string)
{
$slen = strlen($string);
$mlen = 0;
$maxByteLength = 4;
$maxOffset = 7;
for ($i = 0; $i < $slen;    $i) {
$byte = ord($string{$i});
// 從01xxxxxx開始對比,直到11110xxxx 10xxxxxx 10xxxxxx 10xxxxxx。只需要對比第一個位元組即可
for ($offset = 0; $offset < $maxByteLength;    $offset) {
$result = $byte & (1 << ($maxOffset - $offset));
if ($result === 0) {
$i  = $offset;
$mlen;
break;
}
}
}
return $mlen;
}
$string = "Coder不是工程師!";
echo "mb_strlen:" . mb_strlen($string) . "\n";
echo "mStrlen:" . myStrlen($string) . "\n";

瞭解其原理,亂碼不再困惑和迷茫。

參考

https://www.cs.umd.edu/class/…
http://www.unicode.org/faq/ut…
https://my.oschina.net/goal/b…
http://mp.weixin.qq.com/s/2H6…
https://www.lifewire.com/file…

相關文章

程式語言 最新文章