UTF 8編碼問題編碼長度問題

2021-09-01 18:56:50 字數 2561 閱讀 5494

utf-8編碼問題編碼長度問題

utf-8經常被用於文字檔案和網路傳輸,因為不少這類場合還停留在ansi時代,需要向純ascii相容。utf-8是unicode的一種變長字元編碼 ,長度在1至6位元組。這裡注意一下,utf-8曾經是6位元組,現在是4位元組, 兩者都對。 但如果你看到介紹utf-8的文章說是6位元組,基本可以判斷這是比較早的文章。在 內容只是ascii的0x00~0x7f時,utf-8與ascii或各種ansi編碼(如gb,jisksc,iso-8859-1)的ascii部分 完全相容,也是用1位元組的低7位表示。這就保證文字編輯器開啟的utf-8格式文件中,即使擴充套件字元無法顯示,但ascii部分肯定得以順利解讀。這點對 於還需要假定是各種ansi編碼的場合非常有用,比如html,前面的純ascii部分一直到meta標記,然後可以確定隨後的編碼,而此時utf-16 則不能正常工作。utf-8採用如下所示的二進位制方式來表示31位ucs-4,x表示有效位:

1位元組 0******x

2位元組 110***xx 10******

3位元組 1110***x 10****** 10******

4位元組 11110*** 10****** 10****** 10******

5位元組 111110xx 10****** 10****** 10****** 10******

6位元組 1111110x 10****** 10****** 10****** 10****** 10******

從上可以看得出,如果處在第一位元組的引導位元組最高位為0,則是一位元組。否則看前導1的個數,來確定是幾個位元組長。前導1與有效位之間有0相隔,也可以通過首位元組的值範圍來確定位元組數。

1位元組 0 ~127

2位元組 192~223

3位元組 224~239

4位元組 240~247

5位元組 248~251

6位元組 252~253

隨後的位元組每個都以10為前導位,取值範圍則在128~191之間。可以立即得知乙個位元組是否為後續位元組,因為引導位元組的引導位不是00、01就是11,不會是10。

擷取8個字元:

字串:stefan²º¹³

位元組數:14

字元數:10

01110011

01110100

01100101

01100110

01100001

01101110

11000010

10110010

11000010

10111010

11000010

10111001

11000010

10110011

錯誤的:

字串:stefan�0

位元組數:10

字元數:8

01110011

01110100

01100101

01100110

01100001

01101110

11101111

10111111

10111101

00110000

正確的:

字串:stefan²º

位元組數:10

字元數:8

01110011

01110100

01100101

01100110

01100001

01101110

11000010

10110010

11000010

10111010

mb_internal_encoding("utf-8");

$t = "stefan²º¹³";

$t = "絕望的奧特曼絕望的奧特曼";

//$t = "stefan�0";

//$t = mb_substr($t, 0, 8);

$t = my_substr($t, 2, 8);

echo "字串:" . $t . "\n";

echo "位元組數:" . strlen($t) . "\n";

echo "字元數:" . mb_strlen($t) . "\n";

$len = strlen($t);

for($i=0;$i<$len;$i++)

echo $bin . "\n";

}//自定義utf8擷取函式

function my_substr($str, $start, $len)

else if($dec>=192 && $dec<=223)

else if($dec>=224 && $dec<=239)

else if($dec>=240 && $dec<=247)

else if($dec>=248 && $dec<=251)

else if($dec>=252 && $dec<=253)

else

for($j=$byte_len;$j>0;$j--)

$i++;

}if($cur_len>=$start)

$cur_len++;

if($sub_len>=$len)

}return $new_str;

}

UTF8工程編碼問題

問題描述 乙個基於jsp的web業務專案,頁面的charset宣告為utf 8,jb的工程也宣告為utf 8編碼,在利用乙個儲存各種區縣的js檔案的時候jsp頁面報告錯誤 沒有呼叫js中的任何方法,只是include該js進來就報錯,什麼 字元未終結 等等 利用jb開啟中文顯示不正確。問題解決 後來...

eclipse設定UTF 8編碼問題

window preferences general editors text editors spelling encoding utf 8,編輯器的編碼格式 window preferences workspace text file encoding utf 8 開啟eclipse安裝目錄 e...

UTF 8編碼的空格(194 160)問題

前台的字串傳遞到後台進行處理,發現了乙個較詭異的問題 字串中的乙個空格 ascii 32 被utf 8編碼之後變成了乙個詭異的字元 ascii 194 和 160的組合 但在後台其表象還是空格。在utf 8編碼裡面存在乙個特殊的字元,其編碼是 0xc2 0xa0 轉換成字元的時候表現為乙個半角空格,...