神秘空白沸点真相揭秘:其实不是 Bug,是 Unicode 技巧
2025-05-30 08:42 阅读(43)

前言

逛沸点的时候,偶然发现:"咦,是我网卡了吗?怎么这么多沸点都加载不出来?"往下翻了翻,才发现有些沸点其实是可见的。点开评论区看,才明白——原来大家都在发空白内容,我还以为掘金又出 bug 了呢


然后我也尝试了一下,发现发送沸点是做了限制的,你直接输入空格是无法点击发布按钮的,沸点的评论区同理。



那其他人是怎么发出来的,原来只需要复制别人发出来的空白沸点,就可以发送了。



我带着这个好奇排查一下这个问题吧。


编解码

随便找个编解码工具,可以解析出来。


ㅤ 是两个韩文字母空白符(Hangul Filler / "blank-looking" character) ,看起来像空格,但实际上是特殊的 Unicode 字符,编码和普通空格完全不同。


U+3164 → UTF-8 编码:E3 85 A4


怎么解决用户输入这种奇奇怪怪的空白字符

用 input.value.trim() 或简单判断为空字符串 "" 来判断是否允许发送,但像 ㅤ(U+3164)这种看起来是空白但实际上是可见字符,会绕过这类检测。

这里我问的 AI 哥,他推荐的这个办法,我没试过,不保证有效。

简单屏蔽掉一些奇怪空白字符

function isRealEmpty(input: string): boolean {
  // 去掉所有常见的不可见字符和空白字符
  const cleaned = input.replace(/[\s\u200B-\u200D\uFEFF\u3164\u2800\u00A0\u2060\u3000]+/g, '');
  return cleaned.length === 0;
}



使用第三方库

www.npmjs.com/package/val…

import validator from 'validator';

const filtered = validator.whitelist(input, 'a-zA-Z0-9'); // 只保留可见字符
if (validator.isEmpty(filtered)) {
  alert("输入无效");
}


Unicode与utf-8转换关系

Unicode 是给全世界所有字符(如汉字、字母、符号)分配唯一编号(如「中」的编号是  U+4E2D ),相当于“字符字典”。

UTF-8 是一种 把这些编号转换成计算机可存储传输的字节序列的规则,类似“用拼音拼写字典里的字”。

转换关系:


简单字符(如英文字母)用 1 字节表示,复杂字符(如汉字)用 3 字节或更多,且完全兼容英文编码(ASCII)。

例:「A」的 Unicode 是  U+0041 ,转 UTF-8 是  0x41 (1 字节);「中」的 Unicode 是  U+4E2D ,转 UTF-8 是  0xE4 B8 AD (3 字节)。


Unicode 定义“有什么字符、怎么编号”,UTF-8 规定“如何用二进制表示这些编号”。

结语

感觉最后修复也不好,不修也不好。修了的话,用户要是就想发空白的沸点怎么办,不修的话,大家一起发很多空白沸点,看起来又想沸点崩了 23333


作者:代码小学僧

链接:https://juejin.cn