<code>$str1 = "\xe4\xb8\xad"; $str2 = '\xe4\xb8\xad'; $str3 = '中';</code>
能否詳細解釋三者的區別,是否可以相互轉換
<code>$str1 = "\xe4\xb8\xad"; $str2 = '\xe4\xb8\xad'; $str3 = '中';</code>
能否詳細解釋三者的區別,是否可以相互轉換
第一次在segmentfault回答問題。 。
PHP字串變量,雙引號和單引號的意義是不同的
使用雙引號時會轉義 單引號時不轉義
使用雙引號時,$xxxx文字會被對應變數的值替換,單引號沒有這個效果
Eg.
<code class="php">$abc='123'; echo "$abc"; //这样会输出123 echo '$abc'; //这样会输出$abc echo "\n"; //这样会输出一个换行符 echo '\n'; //这样会输出\n两个字符(一个斜杠一个n)</code>
回到問題,
「中」這個漢字在UTF-8的16進位編碼是0xe4,0xb8,0xad
因此在雙引號字串中,會被轉義為「中」 x開頭表示這是一個以十六進位表達的字符,就和HTML中&xe4; 一樣
單引號字串中,直接輸出xe4xb8xad
如果你的環境編碼是在UTF-8下面, str1和str3等價, 如果直接echo, 都會輸出"中", 如果是二進制層面三個字節比較, 也是完全相等, PHP中的字符串就是直接本地編碼二進位儲存的
如果你的環境編碼是非UTF-8(例如GBK), str1基本上是個亂碼, str1和str3也不再等價
至於str2, 它無論什麼時候都會輸出 'xe4xb8xad' (不含引號, 在單引號的字符串中, 只有單引號本身需要轉義成', 其它情況的都視為普通字符處理
只解釋第一個與第二個的區別,也就是單引號與雙引號的區別
雙引號:引號內部會被轉義
單引號:引號內部不會被轉義
<code class="php">$a = 123; echo "output:$a";//output:123 echo 'output:$a';//output:$a //下面的示例仅限linux的php-cli echo "new line\nsecond line"; /* 会换行,输出: new line second line */ echo 'no new line\n aaa'; /* 不会换行,输出: no new line\n aaa */</code>
x
後跟著十六進制數字的屬於轉義字符,轉義字符只有在雙引號"
中才起作用。單引號中只有對單引號本身'
和反斜杠的轉義有效,其他的都無效。
$str1是一個三位元組的字串,字串的三個位元組分別是(十六進位編碼)
E4 B8 AD。如果在UTF-8編碼中,就是
中字。其他編碼中就不一定了。
$str2則是一個12位元組的字串,就是你輸入的那些字元。
$str3則是一個字串,如果你把檔案以UTF-8編碼保存,那就和
$str1是一樣。如果你以GBK保存,那就是兩個位元組的
D6 D0,如果你以BIG5保存,就是
A4 A4。
所以PHP中的非ASCII字元要正常顯示,就要確保你的保存編碼和輸出編碼是一致的。如果是輸出的是HTML,是透過
meta標籤或是在HTTP Header中聲明編碼的。如果不一致,那就會出現亂碼了。