关于UTF-8的空白字符(ASCII码:0xC2 0xA0)。
今天在做项目时遇到一个奇怪的问题,用ThinkPHP,在从mysql读取数据出来之后需要把字段值中包含的空格去掉,于是写了一段代码:
[php]
$description=trim($description);//PHP自带trim()函数去掉“\0\t\n\x0B\r”以及普通半角空格
$description=str_replace(" ","",$description);//去掉半角空格
$description=str_replace(" ","",$description);//去掉全角空格
$description=str_replace(" ","",$description);//去掉代码空格
[/php]
完了之后,哎丫~奇怪了,还是有空格没有去掉。
于是能加的都加上:
[php]
$description=str_replace(" ","",$description);
$description=str_replace(" ","",$description);
$description=str_replace(" ","",$description);
$description=str_replace(" ","",$description);//不知道这么写对不对?
$description=str_replace(" ","",$description);
$description=str_replace(" ","",$description);
$description=str_replace(" ","",$description);
$description=preg_replace('/^\s*|\s*$/is', '',$description);
[/php]
奇怪了,还是有空格没有去掉。于是考虑到可能是编码问题。数据库的编码是UTF-8,页面也是UTF-8,于是先进行编码转换:
[php]
$description=mb_convert_encoding($description,"GBK","UTF-8");//将编码先转换为GBK
$description=trim($description);//PHP自带trim()函数去掉“\0\t\n\x0B\r”以及普通半角空格
$description=str_replace(" ","",$description);//去掉半角空格
$description=str_replace(" ","",$description);//去掉全角空格
$description=str_replace(" ","",$description);//去掉代码空格
$description=mb_convert_encoding($description,"UTF-8","GBK");//替换完毕之后将编码转回UTF-8输出
[/php]
有了点进度,发现替换不掉的空格都变成了英文问号(?,ASCII码:0x3F),好吧我们可以多一步把问号替换掉就可以了,可是究竟这是个神马东西?
在于UTF-8这种编码里面,存在一个特殊的字符,其编码是“0xC2 0xA0”,转换成字符的时候,表现为一个空格,和普通的半角空格“ ”(ASCII码:0x20)一样,唯一的不同是它的宽度不会被压缩,因此常常用于网页排版(如首行缩进)。而GB2312、Unicode之类的编码并没有这个字符,因此UTF-8转码后,这个字符就会被替换成为问号。
使用UTF-8编码进行HTMLDecode的,对于语句开头的空格( ),就会被自动转换成为这个特殊字符(0xC2 0xA0),可能是判断为放在语句开头的空格就是用来排版的。在转换为其他编码之前,这个特殊的空格受到的待遇与普通的半角空格是一致的,甚至也会被trim()去掉,但是如果夹杂在普通空格之间,有时候trim就去不掉它了。
言归正传,那怎么把这个空格字符去掉呢?
我们只需要使用PHP自带函数chr(),chr()是将ASCII码转换为字符的函数,如下:
[php]
$description=str_replace(chr(0xC2).chr(0xA0),"",$description);
[/php]
介个样纸,就万事大吉了。
网上还看到有如下的写法,测试不可行(来自于:http://bbs.csdn.net/topics/390585077):
[php]
$description=str_replace("\xC2\xA0","",$description);
[/php]
另外,关于这个特殊字符,提供两篇参考:
您的赞助将会支持作者创作及本站运维
发表评论