php c2a0,关于php:非破坏utf-8 0xc2a0空间和preg_replace奇怪的行为

p>在我的字符串中,我有utf-8不间断空格(0xc2a0),我想用别的东西替换它./p>

p>当我使用/ p>时

pre> code> $ str = preg_replace('? xc2 xa0~','X',$ str);

/代码>/ PRE>

它运作正常./p>

但是当我使用/ p>时

pre> code> $ str = preg_replace('? x {C2A0} ~siu','W',$ str);

/代码>/ PRE>

p>未找到(并替换)不间断的空间./ p>

P>为什么呢? 第二个regexp有什么问题?/ p>

p>格式代码> x {C2A0} / code>是正确的,我还使用了代码> u / code> flag./p>

可能是因为代码> $ str / code>不是unicode字符串。

实际上,关于PHP中的转义序列的文档是错误的。当您使用代码> xc2 xa0 / code>语法时,它会搜索UTF-8字符。但是使用代码> x {c2a0} / code>语法,它会尝试将Unicode序列转换为UTF-8编码的字符./p>

p>非中断空格是代码> U + 00A0 / code>(Unicode),但在UTF-8中编码为代码> C2A0 / code>。因此,如果您尝试使用模式代码>? x {00a0} ~siu / code>,它将按预期工作./p>

是的, x工作,谢谢。

嗨纽博。 你的回答对我有用,但我仍然不明白为什么。 是因为我的不是UTF-8吗? 我的数据来自具有utf8_general_ci字符集的数据库表,因此它应该是UTF-8(我的character_set_client和character_set_connection也是UTF-8)。 你有链接了解更多信息吗? 谢谢。

a href ="http://rrn.dk/the-difference-between-utf-8-and-unicode">本文/ a>非常了解这个主题。 还有一个href ="http://stackoverflow.com/questions/3951722/whats-the-difference-between-unicode-and-utf8">这个SO问题/ a>前一篇文章已被复制/粘贴。

我已经开始研究以前的答案,以便人们可以复制/粘贴以下代码来选择他们喜欢的方法:/ p>

pre> code> $ some_text_with_non_breaking_spaces ="sometextwith开头有2个非破坏空格";

echo'Qty non-breaking space:'。 substr_count($ some_text_with_non_breaking_spaces," xc2 xa0")。 'BR>';

echo $ some_text_with_non_breaking_spaces。 'BR>';

#方法1:正则表达式

$ clean_text = preg_replace('? x {00a0} ~siu','',$ some_text_with_non_breaking_spaces);

#方法2:转换为bin - > replace - >转换为hex

$ clean_text = hex2bin(str_replace('c2a0','20',bin2hex($ some_text_with_non_breaking_spaces)));

#方法3:我最喜欢的

$ clean_text = str_replace(" xc2 xa0","",$ some_text_with_non_breaking_spaces);

echo'Qty non-breaking space:'。 substr_count($ clean_text," xc2 xa0")。 'BR>';

echo $ clean_text。 'BR>';

/代码> / PRE>

代码> hex2bin()/ code>变量是危险的,它将错误地替换错误对齐的出现。 例如,考虑十六进制序列代码> 0c2a0a / code>。

p>在我看来,这两个代码做了不同的事情:第一个代码> xc2 xa0 / code>将替换两个字符,代码> xc2 / code>和代码> xa0 / code> with nothing./p>

p>在UTF-8编码中,这恰好是代码> U + 00A0 / code>的代码点./ p>

p>代码> x {00A0} / code>有效吗?这应该是代码> xc2 xa0 / code> ./ p>的表示

x工作,谢谢。

p>我没有使用这个变体代码>? x {c2a0} ~siu / code> ./ p>

p> Varian代码> x} / code>有效。我没有尝试过第二个选项,结果如下:/ p>

p>我试图将其转换为十六进制并将无中断空格代码> 0xC2 0xA0(c2a0)/ code>替换为空格代码> 0x20(20)/ code> ./ p>

P>代码:/ P>

pre> code> $ hex = bin2hex($ item);

$ _item = str_replace('c2a0','20',$ hex);

$ item = hex2bin($ _ item);

/代码> / PRE>

谢谢,工作......

p> / x {00A0} /,/ xC2 xA0 /和$ clean_hex2bin-str_replace-bin2hex工作并且不起作用。如果我把它打印到屏幕上,这一切都很好,但是如果我试图将它保存到文件中,那么该文件将是空白的!/ p>

p>我最终使用了iconv('UTF-8','ISO-8859-1 // IGNORE',$ str); / p>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值