$str1 = "\xe4\xb8\xad";$str2 = '\xe4\xb8\xad';$str3 = '中';
能否詳細解釋一下三者的區別,是否可以相互轉化
回複內容:
$str1 = "\xe4\xb8\xad";$str2 = '\xe4\xb8\xad';$str3 = '中';
能否詳細解釋一下三者的區別,是否可以相互轉化
第一次在segmentfault上回答問題。。
PHP字串變數,雙引號和單引號的意義是不同的
使用雙引號時會轉義 單引號時不轉義
使用雙引號時,$xxxx文本會被相應變數的值替換,單引號沒有這個效果
Eg.
$abc='123';echo "$abc"; //這樣會輸出123echo '$abc'; //這樣會輸出$abcecho "\n"; //這樣會輸出一個分行符號echo '\n'; //這樣會輸出\n兩個字元(一個斜杠一個n)
回到問題,
“中”這個漢字在UTF-8的16進位編碼是0xe4,0xb8,0xad
因此在雙引號字串中,會被轉義為 “中” x開頭表示這是一個以十六進位表達的字元,就和HTML中&xe4; 一樣
單引號字串中,直接輸出xe4xb8xad
如果你的環境編碼是在UTF-8下面, str1和str3等價, 如果直接echo, 都會輸出"中", 如果是二進位層面三個位元組比較, 也是完全相等, PHP中的字串就是直接本地編碼二進位儲存的
如果你的環境編碼是非UTF-8(例如GBK), str1基本上是個亂碼, str1和str3也不再等價
至於str2, 它無論什麼時候都會輸出 '\xe4\xb8\xad' (不含引號, 在單引號的字串中, 只有單引號本身需要轉義成\', 其它情況的\都視為一般字元處理
只解釋第一個與第二個的區別,也就是單引號與雙引號的區別
雙引號:引號內部會被轉義
單引號:引號內部不會被轉義
$a = 123;echo "output:$a";//output:123echo 'output:$a';//output:$a//下面的樣本僅限linux的php-cliecho "new line\nsecond line";/*會換行,輸出:new linesecond line*/echo 'no new line\n aaa';/*不會換行,輸出:no new line\n aaa*/
\x後跟著十六進位數位屬於逸出字元,逸出字元只有在雙引號"中才起作用。單引號中只有對單引號本身'和反斜線\的轉義有效,其他的都無效。
PHP本身不區分字元編碼。也就是說,$str1是一個三位元組的字串,字串的三個位元組分別是(十六進位編碼)E4 B8 AD。如果在UTF-8編碼中,就是中字。其他編碼中就不一定了。
而$str2則是一個12位元組的字串,就是你輸入的那些字元。
而$str3則是一個字串,如果你把檔案以UTF-8編碼儲存,那就和$str1是一樣。如果你以GBK儲存,那就是兩個位元組的D6 D0,如果你以BIG5儲存,就是A4 A4。
不管是UTF-8、GBK還是BIG5,甚至於很多其他的語言編碼,都是遵循EUC的,也就是說對於ASCII字元,他們的編碼都是一致的,所以無論用哪種編碼儲存,對PHP的代碼工作都不會有影響。但是對於非ASCII字元就有很大的區別。
所以PHP中的非ASCII字元要正常顯示,就要保證你的儲存編碼和輸出編碼是一致的。如果是輸出的是HTML,是通過meta標籤或者在HTTP Header中聲明編碼的。如果不一致,那就會出現亂碼了。