編碼都是有一定規律的,以UTF8為例,第一個位元組高位除了相容ASCII的128個字元是以0(二進位制,下同)開頭之外0XXXXXXX,其餘的都是以110這樣來開頭的(110XXXXX),其中0前面的1的個數代表這個字元有幾個位元組,而字元的其他位元組都是10開頭的。比如110XXXXX 10XXXXXX就是一個字元,1110XXXX 10XXXXXX 10XXXXXX是一個字元,如果出現110XXXXX 10XXXXXX 10XXXXXX就肯定是不正確的。由於PHP本身不支援多位元組編碼(除非使用多位元組編碼的擴充套件),處理字元都是當作單位元組來對待的,所以處理起來還要麻煩些,只能一個位元組一個位元組地處理。比如這樣處理:讀取一個位元組,如果二進位制值的範圍是0到127(十進位制,下同),說明是ASCII碼,直接忽略。如果在192到223之間,說明是雙位元組的字元,這時再讀取下一個位元組,如果是在128到191之間,說明這個字元正確。如果是224到239之間,則是三位元組字元,下兩個位元組都應該是128到191之間的。如果後面跟著的128到191的位元組數目不對,則字元肯定有錯。以此類推,UTF8最多是六位元組。但這樣只能判斷編碼是否正確,沒法保證內容也是正確的,比如兩個雙位元組,前面的丟了低位的位元組,後面的丟了高位的位元組,組合出來的字元是編碼正確的,但內容卻不對了。GB2312就簡單了,還是看二進位制最高位,如果是0則是相容ASCII的單位元組字元,如果是1則是雙位元組字元,緊接著也要是1開頭的才對。不過也是有取值範圍的,並不是從128到255都有,去看一下GB2312編碼的規則就知道了。其他編碼的話,也有規律可循,研究一下編碼規則去吧,舉一反三。
編碼都是有一定規律的,以UTF8為例,第一個位元組高位除了相容ASCII的128個字元是以0(二進位制,下同)開頭之外0XXXXXXX,其餘的都是以110這樣來開頭的(110XXXXX),其中0前面的1的個數代表這個字元有幾個位元組,而字元的其他位元組都是10開頭的。比如110XXXXX 10XXXXXX就是一個字元,1110XXXX 10XXXXXX 10XXXXXX是一個字元,如果出現110XXXXX 10XXXXXX 10XXXXXX就肯定是不正確的。由於PHP本身不支援多位元組編碼(除非使用多位元組編碼的擴充套件),處理字元都是當作單位元組來對待的,所以處理起來還要麻煩些,只能一個位元組一個位元組地處理。比如這樣處理:讀取一個位元組,如果二進位制值的範圍是0到127(十進位制,下同),說明是ASCII碼,直接忽略。如果在192到223之間,說明是雙位元組的字元,這時再讀取下一個位元組,如果是在128到191之間,說明這個字元正確。如果是224到239之間,則是三位元組字元,下兩個位元組都應該是128到191之間的。如果後面跟著的128到191的位元組數目不對,則字元肯定有錯。以此類推,UTF8最多是六位元組。但這樣只能判斷編碼是否正確,沒法保證內容也是正確的,比如兩個雙位元組,前面的丟了低位的位元組,後面的丟了高位的位元組,組合出來的字元是編碼正確的,但內容卻不對了。GB2312就簡單了,還是看二進位制最高位,如果是0則是相容ASCII的單位元組字元,如果是1則是雙位元組字元,緊接著也要是1開頭的才對。不過也是有取值範圍的,並不是從128到255都有,去看一下GB2312編碼的規則就知道了。其他編碼的話,也有規律可循,研究一下編碼規則去吧,舉一反三。