Unicode U202D 和 U202C 问题总结

在Win10计算器培训中遇到问题,计算结果字符串长度异常,发现存在不可见字符U202D和U202C。这两个Unicode字符导致字符串比较异常,影响自动化处理。通过二进制查看和Unicode查询,了解到其为方向格式化字符,研究其在自动化中的影响。

最近给新人培训的过程中, 在win10的计算器上遇到了一个小问题, 当时本来以为5分钟能给解决, 结果研究了2个小时才找到root cause, 总结一下当时的思路.

环境: Win10 ent x64 21H1

打开计算器, 获取计算结果的文本后, 与预期进行比较, 结果比较总是不会进到 IF里, 明明两个变量都是同样的数字.

刚开始看到这个问题, 我以为是计算器文本中带了 CR/LF/TAB 这类字符串, 便想到了remove前后的特殊字符, 无果.

之后比较了一下获取到的字符串的长度, 明明是一个三位数, 但是string length 竟然是5, 由此便想到放到二进制中查看一下.

 查看发现, 从计算器结果框中取到的值, 多了一个 '- '的字符.

这下就好判断了, 用unicode查看一下取到的变量, 发现获取到的变量中, 是两个不可见字符, U202C 和 U202D.

查了一下这两个字符的用途, 没找到特别满意的答案.不过发现有人跟我遇到了一样的问题.

preview

其实用workaround很容易把这个问题忽略, 但是确实感觉这么一个简单的计算器的automation, 觉得挺有趣的, 就花时间研究了一下. 

字符含义:​​​​​​U+202C Pop Directional Formatting (PDF) Unicode Character (compart.com)

<think>嗯,用户这次的问题是关于字符编码中的特定Unicode控制字符“‭”(U+202D)“‬”(U+202C)。结合用户之前询问过的“$memorySize | $ramSize”表达式(其中也包含U+202D/U+202C),看来用户正在排查文本显示异常问题。 用户可能遇到了这类场景:从某个系统(比如PHP读取的文件或嵌入式配置)中获取的文本出现了意料之外的排版错乱,怀疑是隐藏字符作祟。ta特意引用了Unicode不可见字符列表字符编码原理,说明已有一定技术基础,但需要更落地的解释。 重点需要向用户讲清楚三点: 1. 这两个字符的本质作用:不是“显示符号”,而是像隐形指令一样改变文本方向 2. 实际危害场景:数据解析/代码执行时可能引发bug(比如用户之前遇到的管道符失效) 3. 排查方案:如何检测清理它们 注意到用户提供的引用材料中有PHP相关示例,可以推测ta可能在处理web或文件解析任务。要特别强调PHP中mbstring扩展的处理方式,因为用户引用[1]提到过GBK编码问题,说明项目可能涉及多字节字符集。 需要警惕的是,这类字符常被用于XSS攻击中的视觉欺骗,虽然用户没提安全需求,但作为专业回应应该隐含提醒。不过根据ta之前的关注点,暂时先聚焦技术解析层面。 对了,用户系统指令要求所有公式用$...$包裹。虽然字符编码问题通常不涉及数学公式,但解释字节序时可以举例:比如汉字‘中’的GBK编码$D6D0_{hex}$在小端序中存储为$D0 D6$。这样既符合规范又直观。 </think>字符编码中的 **‭**(U+202D) **‬**(U+202C)是 Unicode 控制字符,主要用于控制文本的**双向排版顺序**(Bidirectional Text)。它们在 IT 领域的核心含义如下: --- ### 1. **字符编码的本质** - 字符编码是将字符(如文字、符号)转换为计算机可存储的二进制数据的规则(如 ASCII、UTF-8)。 - 例如: - 汉字“中”在 GBK 编码中占 `2字节`(`D6 D0`),在 UTF-8 中占 `3字节`(`E4 B8 AD`)。 - 控制字符(如 `‭`)本身不显示,但会影响文本解析逻辑。 --- ### 2. **U+202D U+202C 的作用** | Unicode 码点 | 名称 | 用途 | |--------------|--------------------|----------------------------------------------------------------------| | **U+202D** | `LEFT-TO-RIGHT OVERRIDE` (LRO) | 强制后续文本**从左到右**排列(覆盖默认双向规则)[^2] | | **U+202C** | `POP DIRECTIONAL FORMATTING` (PDF) | **结束**由 LRO/RLO 触发的强制排版方向,恢复默认规则[^2] | #### 典型场景: - **混合语言排版**: 阿拉伯语(从右向左)与英语(从左向右)混合时,用 `‭...‬` 包裹英语文本,确保其方向正确。 ```text "السوق‭ Stock Exchange‬" // 阿拉伯语中的"Stock Exchange"保持左到右 ``` - **防御安全漏洞**: 恶意代码可能用控制字符伪装文件名(如 `exe‭gpj.‬` 显示为 `exe.jpg`),需警惕[^2]。 --- ### 3. **IT 领域的实际问题** - **乱码与解析错误**: 若程序未正确处理双向控制符,会导致: - 文本显示错乱(如 `"123‭ABC‬"` 显示为 `"CBA123"`) - 数据解析失败(如 JSON 中包含 `‭` 可能被误判为非法字符) - **解决方案**: ```php // PHP 示例:过滤控制字符 $clean_text = preg_replace('/[\x{202A}-\x{202E}]/u', '', $raw_text); // 移除U+202A到U+202E字符[^1] ``` - **编码兼容性**: 通信时需统一编码(如 UTF-8)并转换字节序,避免乱码[^1]。 --- ### 4. **与其他控制字符的关联** - **字节顺序标记 (BOM)**: `U+FEFF` 用于标识文本的字节序(如 UTF-16),但可能引发解析冲突。 - **零宽空格**: `U+200B` 可分词但不显示,常用于网页排版。 --- ### 总结 | 字符 | 角色 | 影响领域 | |-----------|--------------------|-----------------------| | **‭ (U+202D)** | 强制左到右排版 | 国际化文本、安全防御 | | **‬ (U+202C)** | 结束强制排版方向 | 数据解析、编码一致性 | **核心建议**: - 在开发中显式处理文本方向时使用这些字符(如多语言 UI)。 - 在数据清洗、通信协议中主动过滤它们,避免副作用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值