utf-8 - php中的字符编码
$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"; //这样会输出123
echo '$abc'; //这样会输出$abc
echo "\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: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
*/
\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中声明编码的。如果不一致,那就会出现乱码了。