首頁  >  文章  >  後端開發  >  utf-8 - php中的字元編碼

utf-8 - php中的字元編碼

WBOY
WBOY原創
2016-12-01 00:56:231237瀏覽

<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後跟著十六進制數字的屬於轉義字符,轉義字符只有在雙引號"中才起作用。單引號中只有對單引號本身'和反斜杠的轉義有效,其他的都無效。

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中聲明編碼的。如果不一致,那就會出現亂碼了。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn