php 空格无法替换,utf-8空格惹的祸
一次坑爹的小bug。读取一段文字(编码utf-8),想替换掉空格,str_replace(" "..)、preg_replace("/\s/"..)都不起作用。
<?php // 替换<p>后4个空格
$str = file_get_contents("http://m.ts.cn/new/99cms_ts/api.php?s=/News/getNewsInfoTmp/Nid/51089");
$str = str_replace(" ", "-", $str);
$str = preg_replace("/\s/", "-", $str);
echo $str; // 不起作用
没办法,将替换不了的空格ord()下才看到,这个utf-8空格比较特殊。ASCII 194 + 160出来的。
<?php // 替换<p>后4个空格
$str = file_get_contents("http://m.ts.cn/new/99cms_ts/api.php?s=/News/getNewsInfoTmp/Nid/51089");
$str = str_replace(chr(194) . chr(160), "-", $str); // 解决方法
echo $str; // OK
实验下这个空格。
<?php // utf-8无bom文件下,四个空格
$s1 = chr(194) . chr(160);
$s2 = chr(32);
$s3 = " ";
$s4 = " "; // 全角空格
$s = $s1 . $s2 . $s3 . $s4; // 判断
$r = '';
if ($s1 == $s2) $r .= 1;
if ($s1 == $s3) $r .= 2;
if ($s1 == $s4) $r .= 3;
if ($s2 == $s3) $r .= 4;
if ($s2 == $s4) $r .= 5;
if ($s3 == $s4) $r .= 6; // 结果
echo $s, "#####", $r, "####", str_replace(" ", "-", $s), "####", preg_replace("/\s/", "-", $s);
结果:为方便书写,|代表空格,|代表全角空格。
||||####4####|--|####|--|
改下浏览器编码为gbk,结果:聽 銆€#####4####聽--銆€####聽--銆€
问题的根源,在于UTF-8这种编码里面,存在一个特殊的字符,其编码是“0xC2 0xA0”(194 160),转换成字符的时候,表现为一个空格,跟一般的半角空格(ASCII 0x20)一样,唯一的不同是它的宽度不会被压缩,因此比较多的被用于网页排版(如首行缩进之类)。而其他的编码方式如GB2312、Unicode之类并没有这样的字符。
总结下来就是:替换不了的字符,打印出ASCII码来总能替换掉吧。
参考:解决采集UTF-8网页空格变成问号乱码 诡异的UTF8空格
php 空格无法替换,utf-8空格惹的祸的更多相关文章
- sql语句如何将多个空格字符替换成一个空格字符
很多时候,数据表中某个字段的值会带有一个或多个空格字符串的情况,面对多样化的需求,我们可能需要将这些空格字符串去除,当然,这很好说,我们可以直接用replace(' ','')将单个空格变成无就可以了 ...
- C# 中将多个空格替换成一个空格
2013-04-17 15:36 C# 中如何将多个空格替换成一个空格? 1 myString = Regex.Replace(myString, @"\s+", " & ...
- ie8 background css没有显示?——都是空格惹的祸
ie8 background css没有显示?——都是空格惹的祸
- c# 字符串去掉两端空格,并且将字符串中多个空格替换成一个空格
字符串去掉两端空格,并且将字符串中多个空格替换成一个空格: 主要还是考察使用字符串的方法: trim(); 去掉字符串两端空格 split(); 切割 string.join(); 连接 class ...
- JS 替换所有的空格
在JS中替换掉输入框内的空格,是在处理表单需求的时候极为常用的一项操作,以防止用户的操作习惯引起数据异常,保证传参的安全性. NO.1 name.replace(" "," ...
- js替换时,空格被替换为双引号
替换代码 str.replace(/\"/g, "'") 将双引号替换为单引号,如果字符串中,存在space(空格)时,使用以上语句将会导致空格被替换为双引号,可以使用如 ...
- UnityToLaya小插件-找出空格并替换
unity导出的文件中经常会出现带有空格的节点或者文件夹 而这些空格在本地开发测试过程中不会出现,当这些带有空格路径的文件需要放到网络上时,就出现问题了 所以这里写了一个简单的查找并清理空格的插件, ...
- notepad++自动对齐使用空格代替Tab并将空格显示为小点
一.说明 对大多数语言而言自动对齐使用空格还是tab对编译运行并没有什么影响,但对python问题就很大:因为就算是缩进看起来是一样的但某些行用空格某些行用tab运行会报错. 另外除了空格替换tab外 ...
- 【trim()】去掉字符串开头和结尾的空格,防止不必要的空格导致的错误。
去掉字符串开头和结尾的空格,防止不必要的空格导致的错误. public static void main(String arg[]){ String a=" abc"; Strin ...
随机推荐
- Vagrant 创建虚拟机
Vagrant 创建虚拟机 1. 下载相关软件 虚拟机软件:vmware virtualbox Vagrant 软件:vagrant cd /tmpwget http://download.vir ...
- 用jquery来实现类似“网易新闻”横向标题滑动的移动端页面
HTML: <div id="navbar"> <div id='navbar_content' style="left:0px;"> ...
- 解析XML:DOM,SAX,PULL
Android解析XML有三种方式:DOM(document object model).SAX(simple api XML).PULL 1.DOM DOM解析XML文件时,会将XML文件的所有内容 ...
- MarkDown编辑使用指南
MarkDown Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. 区块元素 标题title # h1 ## h2 ### h3 # ...
- CI中使用log4php调试程序
下载log4php.我下载的版本是:apache-log4php-2.3.0-src.zip.借压缩,将压缩文件中的src/main/php/文件夹拷贝到CI的application/thrid_pa ...
- <机器学习实战>读书笔记--决策树
1.决策树的构造 createBranch伪代码: 检测数据集中的每个子项是否属于同一分类: IF SO RETURN 类标签 ELSE 寻找划分数据集的最好特征 划分数据集 创建分支节点 FOR 每 ...
- 把AspDotNetCoreMvc程序运行在Docker上-part2:修改容器以及发布镜像
在上一个part<把AspDotNetCoreMvc程序运行在Docker上-part1>,已经将成功将aspdotnetcore程序运行在两个不同的容器中,目前两个容器的内容完全相同,只 ...
- postgresql 备份与恢复
备份 C:\PostgreSQL\\bin>pg_dump -h localhost -p -U postgres Mes > d:/.bak 恢复 C:\PostgreSQL\\bin& ...
- shell通过ping检测整个网段IP的网络状态脚本
要实现Ping一个网段的所有IP,并检测网络连接状态是否正常,很多方法都可以实现,下面简单介绍两种,如下:脚本1#!/bin/sh# Ping网段所有IP# 2012/02/05ip=1 #通过修改初 ...
- 方法返回多个值参数Out使用的方法
string str; Console.WriteLine("请输入用户名"); string user = Console.ReadLine().ToString(); Cons ...