通过这篇博客,你可以了解到以下知识点:
1.什么是零宽空白
2.怎么使零宽空白现身
3.怎么写出零宽空白
注意:
- 下面的代码,请直接复制!!!
- 照着敲是不能复现的!
- 如果复制下面的代码,并没有复现我所述的结果,请坚持看完本文,肯定不会令你失望。
- 语言方面:我此处给出的例子是java代码,读者可以根据自己所使用的语言,自行编写相应的工具。
引例
首先,给出几个小例子:
String bString = new String("1234");
System.out.println(bString.length());
- 1
- 2
看到这个例子,大家可能会会心一笑,这么简单的问题?其实不然,这个长度并不是4,而是5!复制上面的代码,并且运行的时候,看到输出的结果是5,是不是感觉自己的认知受到了颠覆?
再来个例子:
String cString = new String("1234");
System.out.println(cString.length());
- 1
- 2
可能又让大家觉得疑惑了,这和上面的有什么区别呢?如果大家复制并运行的话,会发现结果也是5,从结果来看并没有不同。但是此例中与上例中的“零宽空白”并不是同一个!
不卖关子了,下面给大家讲下为什么会这样:
什么是零宽空白
前言
- 百度百科没有收录这个名词,维基百科收录了.
- 零宽空白是一个实实在在的字符,不是“幽灵”,不是“玄学”
正文:
- 在维基百科的介绍中,零宽空白的学术名称是:“Zero-width space”,简称(ZWSP),是一个 ”非打印字符“,所以是不能被看见的。可以用来分隔字符,占位等。
- 它是一个普通的Unicode字符,它的Unicode字符编码是: U+200B。
- 它的Html实体编码是:​ ; 这里注意下,因为浏览器认识这个字符并且会自动解析成空白,所以我在“​”和“;”之间插入了一个空格,避免被浏览器解析。读者请注意此处。
另外: 不显示的字符并非只有“Zero-width space”,它还有一些兄弟姐妹!我在引例中提及的两个例子中,里面的不显示字符是不同的!下面再给大家介绍另一个不显示的字符:
- 它的学名是:'LEFT-TO-RIGHT EMBEDDING
- Unicode字符编码是:U+202A
- html实体编码: ‪ ;
在Unicode中,还有很多的不显示字符(我在最后的补充会提到)!!!大家有点疑惑,为什么要有这种东西的存在?这不是坑人嘛!其实不然,这些字符都是由=有特殊的用途的!比如填充、占位、控制文字显示的方向(从左向右,从右向左等)等等,这些字符大量用在排版中。那么问题又来了,怎么才能知道字符串中是否包含这些“小精灵”?下面就向大家介绍几种我自己总结的方法:
怎么使零宽空白现身
- Html页面
查看html中这些字符是最简单的!直接在页面中右键-检查网页源码,就能看到他们的真身;
如上图,读者可以看到这么多种的不显示字符!
- 写代码时
可能大家有些字符串,是从别处直接拷贝而来,出现了“令人震惊”的现象时,怎么查看呢?
这里我给大家提供两个方法:
- 一:查看字符串的Unicode编码
public static String stringToUnicode(String s) {
String str = "";
for (int i = 0; i < s.length(); i++) {
int ch = (int) s.charAt(i);
if (ch > 255)
str += s.charAt(i) + ": " + "\\u" + Integer.toHexString(ch) + "\n";
else
str += s.charAt(i) + ": " + "\\u00" + Integer.toHexString(ch) + "\n";
}
return str;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
使用这个方法,就可以将字符串的所有Unicode都显示出来,如下图
就使得3和4之间的“小精灵”现形了!
- 二:使用键盘的左右键移动光标
这些不显示的字符,也像普通的字符一样占据这一个真实的位置。所以可以使用键盘上的左右方向键,移动光标来查看这个小精灵的真实位置。
比如:“1234” ,首先将你的光标放置在4后面时,按下键盘的左方向键,发现光标移动到了4的前面,说明4和引号之间没有。再次按下左方向键,奇迹发生了,光标没有移动!再次按下左方向键,光标移动到了3的前面,这就表明了3和4之间有一个小精灵。按照此法,就可以判断你的字符串中是否有这些特殊的字符了。
但是,只是能找到这些小精灵,如果我想在些特殊的场合中使用呢?那就请看下面的内容:
怎么写出零宽空白
-
html
在html中写出这些字符,其实在上文中已经提及,相信细心的读者也已经发现了。但是我还是要再谈一下:
我目前有种方法编写这些字符:
一:使用html的实体编码,比如:​ ;等
二:在html种直接些Unicode编码,比如:‫ ;
请读者自行比较两者的不同,这里就不再赘述了。 -
代码中
我以java为例,如何直接在字符串中直接编写Unicode编码:
String string= "\u200B";
System.out.println(string);
- 1
- 2
如上面的代码所示,直接在引号中书写 \u + Unicode代码 即可。
补充
- 其他小精灵字符: