特殊字符<200b><200c><200d>的删除办法与原理

今天遇到一个很神奇的bug


一段描述字段,很长一段,中间有如下的字符



这个是在vim 下看到的


但是在php中打印和使用cat看到的情况如下:




这就很神奇了,所以肉眼看不见



尝试解决办法:str_replace  <200b>发现没用。



解决办法:

$value = str_replace("\xe2\x80\x8b", '', $value);
$value = str_replace("\xe2\x80\x8c", '', $value);
$value = str_replace("\xe2\x80\x8d", '', $value);


原理:




文字说明:

这些字符其实就是排版过程中产生的,而排版使用的规范是Unicode编码标准 


扩展阅读:



### 关于 Unicode 字符被视为空白警告的解决方案 在 C++ 编程中,当编译器(如 GCC 或 Clang)遇到某些不可见的 Unicode 字符时,可能会触发 `-Wunicode-whitespace` 警告。这些字符通常是在编辑源文件过程中意外引入的,比如复制粘贴操作中的特殊空白字符。 #### 原因分析 此警告的核心在于一些特殊的 Unicode 空白字符[^3],它们虽然看起来像普通的空格,但在标准 ASCII 中并不存在。常见的例子包括不中断空格(U+00A0)、零宽空格(U+200B),以及其他非打印字符。GCC 和 Clang 默认会检测到这些问题,并发出 `[-Wunicode-whitespace]` 提醒开发者注意潜在问题。 #### 解决方法 以下是几种可能的解决方式: 1. **移除非法字符** 使用文本编辑器的手动查找功能或者正则表达式来定位和删除这些隐藏字符。例如,在 Vim 中可以运行以下命令: ```vim :set list ``` 这样可以看到所有的不可见字符。接着通过替换命令清除特定范围内的异常字符: ```vim :%s/[^\x00-\x7F]//g ``` 2. **调整编译选项** 如果确认这些字符不会影响程序逻辑,可以选择关闭该类别的警告。可以通过向编译参数添加如下标志实现: ```bash -Wno-unicode-whitespace ``` 3. **验证输入数据** 对于动态生成的内容或外部导入的数据,应增加额外校验层以防止非法字符混入最终代码库。例如利用函数检查字符串是否含有可疑成分: ```cpp bool containsInvalidWhitespace(const std::string& str) { static const std::regex invalidRegex(R"([^\P{Z}\p{Cf}])"); return std::regex_search(str, invalidRegex); } ``` 4. **统一编码环境** 鉴于不同平台间可能存在编码差异引发误解读情况,建议始终采用 UTF-8 作为项目内部唯一文字表示形式[^2]。这样能有效减少跨设备协作期间产生的兼容性难题。 综上所述,针对上述提到的现象采取适当措施即可消除此类编译期提示信息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值