关于php的字符串编码
PHP中的字符串可以用四中方式來定義:
單引號,雙引號,Nowdoc結(jié)構(gòu) , heredoc 結(jié)構(gòu)
也就說用這四中方式命名的字符串不管有沒有值,都是字符串類型的變量。
但是,字符串遍歷是已經(jīng)定義好了怎么操作這些字符串,就需要考慮,當(dāng)截取中文的時候大部分我們都會用substr但是都會有出現(xiàn)亂碼的經(jīng)歷,這就是因為php的字符串編碼方式的原因;
php手冊中關(guān)于字符串定義部分有這樣一部分,一個字符串?string?就是由一系列的字符組成,其中每個字符等同于一個字節(jié)。這意味著 PHP 只能支持 256 的字符集,因此不支持 Unicode 。這句話的意思也就是不支持多字節(jié)的編碼的方式所以當(dāng)用substr截取中文的時候會出現(xiàn)亂碼,因為中文如果是gbk編碼的話會占用兩個字節(jié),UTF8編碼的話會占用三個字節(jié),也就是說一個中文字的如果用strlen統(tǒng)計的話長度會是2或是3,這也就是substr出現(xiàn)亂碼的原因。
字符串類型:
PHP 中的?string?的實(shí)現(xiàn)方式是一個由字節(jié)組成的數(shù)組再加上一個整數(shù)指明緩沖區(qū)長度。并無如何將字節(jié)轉(zhuǎn)換成字符的信息,由程序員來決定。字符串由什么值來組成并無限制(也就是字符串可以使二進(jìn)制方式,十六進(jìn)制方式等等其他方式)。字符串類型的此特性解釋了為什么 PHP 中沒有單獨(dú)的“byte”類型 - 已經(jīng)用字符串來代替了。返回非文本值的函數(shù) - 例如從網(wǎng)絡(luò)套接字讀取的任意數(shù)據(jù) - 仍會返回字符串。
由于 PHP 并不特別指明字符串的編碼,那字符串到底是怎樣編碼的呢?例如字符串?"á"?到底是等于?"\xE1"(ISO-8859-1),"\xC3\xA1"(UTF-8,C form),"\x61\xCC\x81"(UTF-8,D form)還是任何其它可能的表達(dá)呢?答案是字符串會被按照該腳本文件相同的編碼方式來編碼。因此如果一個腳本的編碼是 ISO-8859-1,則其中的字符串也會被編碼為 ISO-8859-1,以此類推。不過這并不適用于激活了 Zend Multibyte 時;此時腳本可以是以任何方式編碼的(明確指定或被自動檢測)然后被轉(zhuǎn)換為某種內(nèi)部編碼,然后字符串將被用此方式編碼。注意腳本的編碼有一些約束(如果激活了 Zend Multibyte 則是其內(nèi)部編碼)- 這意味著此編碼應(yīng)該是 ASCII 的兼容超集,例如 UTF-8 或 ISO-8859-1。不過要注意,依賴狀態(tài)的編碼其中相同的字節(jié)值可以用于首字母和非首字母而轉(zhuǎn)換狀態(tài),這可能會造成問題。也就是說不要依據(jù)文本的編碼方式來處理字符串應(yīng)該使用mbstring這種方式來處理。
?
當(dāng)然了,要做到有用,操作文本的函數(shù)必須假定字符串是如何編碼的。不幸的是,PHP 關(guān)于此的函數(shù)有很多變種:
- 某些函數(shù)假定字符串是以單字節(jié)編碼的,但并不需要將字節(jié)解釋為特定的字符。例如?substr(),strpos(),strlen()?和strcmp()。理解這些函數(shù)的另一種方法是它們作用于內(nèi)存緩沖區(qū),即按照字節(jié)和字節(jié)下標(biāo)操作。
- 某些函數(shù)被傳遞入了字符串的編碼方式,也可能會假定默認(rèn)無此信息。例如?htmlentities()?和?mbstring?擴(kuò)展中的大部分函數(shù)。
- 其它函數(shù)使用了當(dāng)前區(qū)域(見?setlocale()),但是逐字節(jié)操作。例如?strcasecmp(),strtoupper()?和?ucfirst()。這意味著這些函數(shù)只能用于單字節(jié)編碼,而且編碼要與區(qū)域匹配。例如?strtoupper("á")?在區(qū)域設(shè)定正確并且?á?是單字節(jié)編碼時會返回?"á"。如果是用 UTF-8 編碼則不會返回正確結(jié)果,其結(jié)果根據(jù)當(dāng)前區(qū)域有可能返回?fù)p壞的值。
- 最后一些函數(shù)會假定字符串是使用某特定編碼的,通常是 UTF-8。intl?擴(kuò)展和?PCRE(上例中僅在使用了?u?修飾符時)擴(kuò)展中的大部分函數(shù)都是這樣。盡管這是由于其特殊用途,utf8_decode()?會假定 UTF-8 編碼而?utf8_encode()?會假定 ISO-8859-1 編碼。
最后,要書寫能夠正確使用 Unicode 的程序依賴于很小心地避免那些可能會損壞數(shù)據(jù)的函數(shù)。要使用來自于?intl?和mbstring?擴(kuò)展的函數(shù)。不過使用能處理 Unicode 編碼的函數(shù)只是個開始。不管用何種語言提供的函數(shù),最基本的還是了解 Unicode 規(guī)格。例如一個程序如果假定只有大寫和小寫,那可是大錯特錯。
轉(zhuǎn)載于:https://www.cnblogs.com/phplhs/p/3668353.html
總結(jié)
以上是生活随笔為你收集整理的关于php的字符串编码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Delphi 对象的创建(create)
- 下一篇: php职业性格测试,三个职业测试方法,助