整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

html原始字符及其用法

箭头类

符号

UNICODE



符号

UNICODE



HTML

JS

CSS

HTML

JS

CSS



\u21E0

E0

\u21E2

E2

\u21E1

E1

\u21E3

E3

\u219E

9E

\u21A0

A0

\u219F

9F

\u21A1

A1

\u2190

90

\u2192

92

\u2191

91

\u2193

93

\u2194

94

\u2195

95

\u21C4

C4

\u21C5

C5

\u21A2

A2

\u21A3

A3

\u21DE

DE

\u21DF

DF

\u21AB

AB

\u21AC

AC

\u21DC

DC

\u21DD

DD

\u219A

9A

\u219B

9B

\u21AE

AE

\u21AD

AD

\u21E6

E6

\u21E8

E8

\u21E7

E7

\u21E9

E9

\u25B2

B2

\u25BA

BA

\u25BC

BC

\u25C4

C4

\u2794

94

\u2799

99

\u27A8

A8

\u27B2

B2

\u279C

9C

\u279E

9E

\u279F

9F

\u27A0

A0

\u27A4

A4

\u27A5

A5

\u27A6

A6

\u27A7

A7

\u27B5

B5

\u27B8

B8

\u27BC

BC

\u27BD

BD

\u27BA

BA

\u27B3

B3

\u21B7

B7

\u21B6

B6

\u21BB

BB

\u21BA

BA

\u21B5

B5

\u21AF

AF

\u27BE

BE





❤ 基本形状类

符号

UNICODE



符号

UNICODE



HTML

JS

CSS

HTML

JS

CSS



\u2764

64

\u2708

08

\u2605

05

\u2726

26

\u2600

00

\u25C6

C6

\u25C8

C8

\u25A3

A3

\u263B

3B

\u263A

3A

\u2639

39

\u2709

09

\u260E

0E

\u260F

0F

\u2706

06

\uFFFD

\FFFD

\u2601

01

\u2602

02

\u2744

44

\u2603

03

\u2748

48

\u273F

3F

\u2740

40

\u2741

41

\u2618

18

\u2766

66

\u9749

49

\u2742

42

\u2625

25

\u262E

2E

\u262F

2F

\u262A

2A

\u2624

24

\u2704

04

\u2702

02

\u2638

38

\u2693

93

\u2623

23

\u26A0

A0

\u26A1

A1

\u2622

22

\u267B

7B

\u267F

7F

\u2620

20

¥ 货币类

符号

UNICODE



符号

UNICODE



HTML

JS

CSS

HTML

JS

CSS



$

$

\u0024

>\0024<24

¢

¢

\u00A2

>\00A2<>

£

£

\u00A3

>\00A3<>

¤

¤

\u00A4

>\00A4<>

\u20AC

AC

¥

¥

\u00A5

>\00A5<>

\u20B1

B1

\u20B9

B9

½ 数学类

符号

UNICODE



符号

UNICODE



HTML

JS

CSS

HTML

JS

CSS



½

½

\u00BD

>\00BD<>

¼

¼

\u00BC

>\00BC<>

¾

¾

\u00BE

>\00BE<>

\u2153

53

\u2154

54

\u215B

5B

\u215C

5C

\u215D

5D

\u2030

30

%

%

\u0025

>\0025<25

<

<

\u003C

>\003C<3C

>

>

\u003E

>\003E<3E

♫ 音乐符号类

符号

UNICODE



符号

UNICODE



HTML

JS

CSS

HTML

JS

CSS



\u2669

69

\u266A

6A

\u266B

6B

\u266C

6C

\u266D

6D

\u266F

6F

✖ 对错号

符号

UNICODE



符号

UNICODE



HTML

JS

CSS

HTML

JS

CSS




 

\u00A0

>\00A0<>

\u2610

10

\u2611

11

\u2612

12

\u2713

13

\u2714

14

\u10005

005

\u2716

16

\u2717

17

\u2718

18

★ 全都是星星

符号

UNICODE



符号

UNICODE



HTML

JS

CSS

HTML

JS

CSS



\u2605

05

\u272D

2D

\u272E

2E

\u2606

06

\u272A

2A

\u2721

21

\u272F

2F

\u2735

35

\u2736

36

\u2738

38

\u2739

39

\u273A

3A

\u2731

31

\u2732

32

\u2734

34

\u2733

33

\u273B

3B

\u273D

3D

\u274B

4B

\u2746

46

\u2744

44

\u2745

45

♒ 星座类

符号

UNICODE



符号

UNICODE



HTML

JS

CSS

HTML

JS

CSS



\u2648

48

\u2649

49

\u264A

4A

\u264B

4B

\u264C

4C

\u264D

4D

\u264E

4E

\u264F

4F

\u2650

50

\u2651

51

\u2652

52

\u2653

53

♚ 国际象棋类

符号

UNICODE



符号

UNICODE



HTML

JS

CSS

HTML

JS

CSS



\u265A

5A

\u265B

5B

\u265C

5C

\u265D

5D

\u265E

5E

\u265F

5F

\u2654

54

\u2655

55

\u2656

56

\u2657

57

\u2658

58

\u2659

59

♣ 扑克牌类

符号

UNICODE



符号

UNICODE



HTML

JS

CSS

HTML

JS

CSS



\u2660

60

\u2663

63

\u2665

65

\u2666

66

\u2664

64

\u2667

67

\u2661

61

\u2662

62

Ω 希腊字母

符号

UNICODE



符号

UNICODE



HTML

JS

CSS

HTML

JS

CSS



Α

Α

\u0391

91

Β

Β

\u0392

92

Γ

Γ

\u0393

93

Δ

Δ

\u0394

94

Ε

Ε

\u0395

95

Ζ

Ζ

\u0396

96

Η

Η

\u0397

97

Θ

Θ

\u0398

98

Ι

Ι

\u0399

99

Κ

Κ

\u039A

9A

Λ

Λ

\u039B

9B

Μ

Μ

\u039C

9C

Ν

Ν

\u039D

9D

Ξ

Ξ

\u039E

9E

Ο

Ο

\u039F

9F

Π

Π

\u03A0

A0

Ρ

Ρ

\u03A1

A1

Σ

Σ

\u03A3

A3

Τ

Τ

\u03A4

A4

Υ

Υ

\u03A5

A5

Φ

Φ

\u03A6

A6

Χ

Χ

\u03A7

A7

Ψ

Ψ

\u03A8

A8

Ω

Ω

\u03A9

A9

☩ 十字

符号

UNICODE



符号

UNICODE



HTML

JS

CSS

HTML

JS

CSS



\u2628

28

\u2629

29

\u271D

1D

\u271E

1E

\u271F

1F

\u2720

20

\u271A

1A

\u2020

20

\u2722

22

\u2724

24

\u2723

23

\u2725

25

© 法律符号

符号

UNICODE



符号

UNICODE



HTML

JS

CSS

HTML

JS

CSS



®

®

\u00AE

>\00AE<>

©

©

\u00A9

>\00A9<>

\u2117

17

\u0099

>\0099<99

\u2120

20





@ 标点和符号

符号

UNICODE



符号

UNICODE



HTML

JS

CSS

HTML

JS

CSS



«

«

\u00AB

>\00AB<>

»

»

\u00BB

>\00BB<>

\u008B

>\008B<8B

\u009B

>\009B<9B

\u201C

1C

\u201D

1D

\u2018

18

\u2019

19

\u2022

22

\u25E6

E6

¡

¡

\u00A1

>\00A1<>

¿

¿

\u00BF

>\00BF<>

\u2105

05

\u2116

16

&

&

\u0026

>\0026<26

@

@

\u0040

>\0040<40

\u211E

1E

\u2103

03

\u2109

09

°

°

\u00B0

>\00B0<>



|

\u007C

>\007C<7C

¦

¦

\u00A6

\u2013

13

\u2014

14

\u2026

26

\u00B6

>\00B6<>

\u223C

3C

\u2260


用法

三种用法都在里面了

nicode 联盟(Unicode Consortium)

Unicode 联盟(Unicode Consortium)开发了 Unicode 标准(Unicode Standard)。他们的目标是使用标准的 Unicode 转换格式(即 UTF,全称 Unicode Transformation Format)取代现有的字符集。

Unicode 标准是一个成功的创举,在 HTML、XML、Java、JavaScript、E-mail、ASP、PHP 中都得到实现。Unicode 标准也得到许多操作系统和所有现代浏览器的支持。

Unicode 联盟与领先的标准开发组织合作,这些组织有 ISO、W3C 和 ECMA。


Unicode 字符集

Unicode 可以由不同的字符集实现。最常用的编码是 UTF-8 和 UTF-16:

字符集描述
UTF-8UTF8 中的字符可以是 1 到 4 字节长。UTF-8 可以代表 Unicode 标准中的任何字符。UTF-8 向后兼容 ASCII。UTF-8 是电子邮件和网页的首选编码。
UTF-1616 位 Unicode 转换格式是一种可变长度的 Unicode 字符编码,能够编码整个 Unicode 指令表。UTF-16 主要用于操作系统和环境,如 Microsoft Windows、Java 和 .NET。

提示:Unicode 的前 128 个字符(与 ASCII 一一对应)使用一个与 ASCII二进制值相同的八位组进行编码,使有效的 ASCII 文本在进行 UTF-8 编码时也是有效的。

提示:所有的 HTML 4 处理器支持 UTF-8,所有的 HTML 5 和 XML 处理器支持 UTF-8 和 UTF-16!


HTML5 标准:Unicode UTF-8

因为 ISO-8859 中字符集大小是有限的,且在多语言环境中不兼容,所以 Unicode 联盟开发了 Unicode 标准。

Unicode 标准覆盖了(几乎)所有的字符、标点符号和符号。

Unicode 使文本的处理、存储和运输,独立于平台和语言。

HTML-5 中默认的字符编码是 UTF-8。

下面列出了一些 HTML5 支持的 UTF-8 字符集:

字符集十进制十六进制
C0 控制与基本的 Latin(C0 Controls and Basic Latin)0-1270000-007F
C1 控制与 Latin-1 的补充(C1 Controls and Latin-1 Supplement)128-2550080-00FF
Latin 扩展 A(Latin Extended-A)256-3830100-017F
Latin 扩展 B(Latin Extended-B)384-5910180-024F

如果 HTML5 网页使用不同于 UTF-8 的字符,则需要在 <meta> 标签中指定,如下:

实例

<meta charset="ISO-8859-1">

如您还有不明白的可以在下面与我留言或是与我探讨QQ群308855039,我们一起飞!

周的时候,朋友圈的直升飞机不知道为什么就火了,很多朋友开着各种花式飞机带着起飞。

图片来自网络

还没来得及了解咋回事来着,这个直升飞机就到的微博热搜。

图片来自网络

后面越来越多人开来他们的直升飞机,盘旋在朋友圈上方。于是很多朋友开来他们的坦克,专打直升飞机,一轰一个准。

图片来自网络

好了,说回正题!

程序员朋友应该都很熟悉 Unicode (万国码),它几乎包含世界上所有符号,比如组成直升飞机这几个特殊符号对应的 Unicode 码分别为:

ps:推荐一个网站,可以根据符号搜对应的 Unicode 码:https://unicode.yunser.com/unicode

除了这些正常字符以外,Unicode 还包含着各种各样的奇葩字符。

奇葩字符

除了正常的我们熟知的文字以外,Unicode 中还有一些奇怪的文字,比如下面这些文字

这咋读?某少?

世代?

恩?超出认知范围

除了这些奇怪文字以外,Unicode 还有一些奇葩的的符号。

例如下面一整套麻将牌:

一整套的扑克牌:

一整套国际象棋:

image-20200725215319183

除了这些,通过组合符合,我们还可以造出各种各样的颜文字(๑•̀ㅂ•́)و✧、

另外 Unicode 还收录着我们常用的 Emoji

除了这些之外,Unicode 中还有一些特殊字符的,利用这些字符,我们还可以玩出很多有趣的骚操作。

组合字符

Unicode 有一类字符称为组合字符,它可以附加在前一个非组合字符上,从而使整体看起来像是一个字符。

组合字符原来目的是为了解决一些地区语言、文字特殊的需要,比如说泰文声调符号与母音符号。

正常使用的情况下,这些组合字符数量都会有一些限制。但是在 Unicode 组合字符设计上,并没有加这种限制,这样使我们可以无限加这类组合字符。

利用这个特性,可以达到一些恶搞效果,比如「击穿天花板」与「凿穿地板」的效果。

上面实现原理其是利用以下两个组合字符:

上翻字符

下翻字符

只要复制这两个字符相应的 HTML 代码,跟在正常的字符后面,就可以使这两个字符附加在普通字符上,比如下面实现效果为

黑̮̑

Unicode 码值通常使用 U+N(16 进制N 代表码值),比如 A 的码值为 U+0041。

在 HTML 中 Unicode 可以使用 &#N;(十进制,N 代表码值)表示

在 JS 中 Unicode 中需要使用] \uN(16 进制N 代表码值)表示

只要我们在普通字符多复制几个这类附加字符,就可以形成上述「击穿」效果。

还记得上面说的泰文吗,曾经有一段时间贴吧,很流行一种喷射文,比如下面的效果。

向左喷

向右喷

左右互喷

这种喷射文实际原理就是利用泰文中声调符号附加在其他正常符号上。

不过现在这个效果貌似已经没办法再复现了,现在我们只能看到这样的效果:

在一些老版本的系统/浏览器可能还能看到这种效果,知道的小伙伴留言区可以告知一下。

字符

Unicode 中还有一类格式字符,不可见,不可打印,主要作用于调整字符的显示格式,所以我们将其称为零宽字符。

零宽字符主要有以下几类:

零宽度空格符 (zero-width space) U+200B : 用于较长单词的换行分隔

零宽度非断空格符 (zero width no-break space) U+FEFF : 用于阻止特定位置的换行分隔

零宽度连字符 (zero-width joiner) U+200D : 用于阿拉伯文与印度语系等文字中,使不会发生连字的字符间产生连字效果

零宽度断字符 (zero-width non-joiner) U+200C : 用于阿拉伯文,德文,印度语系等文字中,阻止会发生连字的字符间的连字效果

左至右符 (left-to-right mark) U+200E : 用于在混合文字方向的多种语言文本中(例:混合左至右书写的英语与右至左书写的希伯来语),规定排版文字书写方向为左至右

右至左符 (right-to-left mark) U+200F : 用于在混合文字方向的多种语言文本中,规定排版文字书写方向为右至左

利用零宽字符不不可见的特性,我们也可以玩出一些骚效果。

空白微博

发布微博的时候,如果内容都是空格,将没办法发布。

但是如果我们将零宽字符,比如说「零宽度空格符 U+200B」复制到微博,这样我们就可以发布空白微博。

我们可以利用 Chrome 浏览器的控制台复制零宽字符,操作方式如下:

发布效果如下:

真的没有改 HTML 导致的.jpg

隐形水印

对于一些内部论坛或者说小说网站来说,可以通过零宽字符在帖子或小说内容嵌入隐形水印。

当这些内容被一些爬虫复制到其他网站时,我们就可以通过隐形水印,轻松查找时那位用户泄漏内容。

隐形水印主要原理就是将用户信息比如用户名,通过一定算法转成零宽字符,这样普通用户浏览时完全看不到这个水印。

如果内容被复制到其他网站,隐形谁赢也被复制,只要找到这个水印,将这些零宽字符反转成用户名即可。

下面展示一种转换方法,JS 代码主要参考以下 Github 项目:

https://github.com/umpox/zero-width-detection

隐形水印生成方法

第一步我们需要将明文字符串每个字符都转成二进制串。

    // 每个字符转为二进制,用空格分隔
    const textToBinary = username => (
      username
      .split('')
      // charCodeAt 将字符转成相应的 Unicode 码值
      .map(char => char.charCodeAt(0).toString(2))
      .join(' ')
    );

示例如下:

第二步,将二进制串转为零度字符串,转换规则如下:

  • 1 转换为 \u200b 零宽度字符(zero-width space)
  • 0 转换为 \u200c 零宽度断字符(zero-width non-joiner)
  • 其他(剩余就是空格) 转换为 \u200d 零宽度连字符 (zero-width joiner)
  • 最后使用 \ufeff 零宽度非断空格符 (zero width no-break space) 作为分隔符
const binaryToZeroWidth = binary => (
  binary.split('').map((binaryNum) => {
    const num = parseInt(binaryNum, 10);
    if (num === 1) {
      return '\u200b'; // \u200b 零宽度字符(zero-width space)
    } else if(num===0) {
      return '\u200c'; // \u200c 零宽度断字符(zero-width non-joiner)
    }
    return '\u200d'; // \u200d 零宽度连字符 (zero-width joiner)

  }).join('\ufeff') // \ufeff 零宽度非断空格符 (zero width no-break space)
);

最终加密方法如下:

const encode = username => {
  const binaryUsername = textToBinary(username);
  const zeroWidthUsername = binaryToZeroWidth(binaryUsername);
  return zeroWidthUsername;
};

使用加密方法将明文字符串加密之后,加密字符串肉眼是看不到了,但是实际还是存在的。

实际上,如果我们将加密之后字符串复制到 BEJSON 网站,就可以看到字符。

image-20200722083507869

另外你还可以把加密字符串复制到 IDEA 中,可以看到相应的 Unicode 编码值。

解密隐形水印

知道了加密的方式,解密其实就很简单,我们只要按照相反步骤的来就可以了。

第一步,将隐形水印按照以下规则转换为二进制串。转换规则如下:

  • 使用 \ufeff 分隔字符串
  • \u200b 转为 1
  • \u200c 转为 0
  • 其他字符使用空格
const zeroWidthToBinary = string => (
  string.split('\ufeff').map((char) => { // \ufeff 零宽度非断空格符 (zero width no-break space)
    if (char === '\u200b') { // \u200b 零宽度字符(zero-width space)
      return '1';
    } else if(char === '\u200c') { // \u200c 零宽度断字符(zero-width non-joiner)
      return '0';
    }
    return ' ';
  }).join('')
);

调用该方法,隐形水印转成二进制串。

第二步,将二进制再转为相应的字符。

const binaryToText = string => (
  // fromCharCode 二进制转化
  string.split(' ').map(num => String.fromCharCode(parseInt(num, 2))).join('')
);

最终解密方法如下:

const decode = zeroWidthUsername => {
  const binaryUsername = zeroWidthToBinary(zeroWidthUsername);
  const textUsername = binaryToText(binaryUsername);
  return textUsername;
};

解密示例如下:

短网址

我们常用的短网址,域名后面会跟上一串随机串,从而实现短网址到长网址的映射。比如以下网址:

https://sourl.cn/iLyn9S

然而我们可以利用零宽字符也可以实现短网址的效果,,比如下面这个网站,就可以生成这类短网址。

https://zws.im/

可以看到这个短网址后面看不到任何字符,实际上这后面跟着一串零宽字符。当浏览器访问该短网址时,后端程序只要反解密的后面零宽字符,拿到相应的网址,然后在做跳转就可以到指定的网站。

反解密的原理可以参考上面隐形水印的代码

小心零宽字符

日常开发过程中,我们有时需要从一些文件中读取文本内容,然后做相应的处理。

有时候我们可能会碰到一些诡异的现象,比如我们之前碰到的例子。

后台程序从 Excel 读取文本内容,然后程序中判断是读取的文本内容是否与指定的字符串相等。

然后当我们读取一份 Excel 内容后,返现这段比较逻辑怎么也通过不了。本来以为是 Excel 内容存在空格什么的,但是打开 Excel 仔细一看,跟指定字符串一模一样,并没有什么其他字符。

第一次碰到这种例子,没有什么经验,真的排查了很久,到最后都有点怀疑人生了。最后无意间将文本内容复制到了 IDEA 中,才发现整理混杂着零宽字符!

如果各位小伙伴也碰到这类问题,不妨将复制文本内容,然后到 IDEA 中查看是否存在某些看不见字符~

最后(点个赞呗!)

这两个星期一直很忙,一直都在 9106 的节奏,真的是累,所以断更了一周!

所幸最近项目提测,稍微轻松了一点,能有点划水时间来写写文章。不过再提起笔来写文章,就有点断节奏了!

这篇文章墨迹了很久才水出来,下周开始再次恢复周更的节奏,再忙再累,每周都来一篇。

欢迎各位小伙伴,每周来这里蹲我,Gank 我!!!

好了,我是楼下小黑哥,下周见!!!

参考链接

  1. https://juejin.im/post/5d3f01e7f265da03c23ead69
  2. http://zero.rovelast.com/
  3. https://zws.im/
  4. https://imweb.io/topic/5a08a5c7ef79bc941c30d8dd