PHP替換UTF-8的空格(0xC2 0xA0)

关于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]

另外,关于这个特殊字符,提供两篇参考:

您的赞助将会支持作者创作及本站运维

发表评论


TOP