当前位置: 首页 > news >正文

前端开发中的特殊字符

一、什么是特殊字符?

在前端语境中,特殊字符(Special Characters)是指那些在特定语言或上下文中具有特殊语法意义、控制功能或需要特别编码的字符。它们可以分为以下几类:

  • 语法控制字符:用于定义语言结构(如 HTML 标签、JS 字符串边界)。
  • 转义字符:用于表示不可见或无法直接输入的字符。
  • 保留字符:在协议或格式中有预定义用途(如 URL 中的 ?&)。
  • 安全敏感字符:可能被用于注入攻击(如 <script>)。
  • Unicode 字符:非 ASCII 字符,如表情符号、数学符号、多语言文字。

二、HTML 中的特殊字符

HTML 使用特定字符来定义文档结构,因此以下字符在文本内容中必须进行转义,否则会被解析为 HTML 语法。

1. 必须转义的五大核心字符

字符实体名称十进制编码说明
<&lt;&#60;标签开始符,避免被解析为标签
>&gt;&#62;标签结束符
&&amp;&#38;实体引用符,自身也需转义
"&quot;&#34;属性值双引号,在双引号属性中使用
'&apos;&#39;单引号,部分浏览器支持,推荐用 &#39;

最佳实践:在动态插入文本时,优先使用 textContent 而非 innerHTML,可自动避免 HTML 注入。

2. 常用符号与实体

字符实体十进制含义
©&copy;&#169;版权符号
®&reg;&#174;注册商标
&trade;&#8482;商标
&euro;&#8364;欧元
¥&yen;&#165;日元/人民币
£&pound;&#163;英镑
§&sect;&#167;章节符
±&plusmn;&#177;正负号
×&times;&#215;乘号
÷&divide;&#247;除号

3. 空白字符与布局控制

实体含义说明
&nbsp;不间断空格防止浏览器合并空格或换行
&ensp;半角空格(en space)宽度约为一个英文字母
&emsp;全角空格(em space)宽度约为两个英文字母
&thinsp;细空格更窄的空白
&zwj;零宽连接符用于连接 emoji(如 👨‍👩‍👧‍👦)
&zwnj;零宽不连接符防止字符连写(如某些语言中)

三、JavaScript 中的特殊字符

JavaScript 中的特殊字符主要出现在字符串、正则表达式和转义序列中。

1. 字符串中的转义序列(Escape Sequences)

转义序列含义Unicode
\n换行符(Line Feed)\u000A
\r回车符(Carriage Return)\u000D
\t制表符(Tab)\u0009
\\反斜杠\u005C
\'单引号\u0027
\"双引号\u0022
\b退格符\u0008
\f换页符\u000C
\0空字符(Null)\u0000
\v垂直制表符\u000B
\xXXLatin-1 字符(如 \xA9 → ©)\x 后跟两个十六进制数
\uXXXXUnicode 字符(如 \u2665 → ♥)\u 后跟四个十六进制数
\u{XXXXX}扩展 Unicode(如 \u{1F600} → 😄)ES6 支持大括号形式

提示:使用模板字符串(`Hello ${name}`)可避免多行字符串中的 \n 问题。

2. 正则表达式中的元字符(Metacharacters)

以下字符在正则中具有特殊含义,需用 \ 转义以匹配字面值:

.  *  +  ?  ^  $  \  |  (  )  [  ]  {  }  /
  • .:匹配任意字符(除换行符)
  • ^$:行首/行尾锚点
  • *+?:量词(0+次、1+次、0或1次)
  • |:逻辑“或”
  • ():分组与捕获
  • []:字符类(如 [a-z]
  • {}:精确量词(如 {3,5}
  • /:正则字面量的分隔符

安全建议:动态构建正则时,使用 RegExp.escape()(提案中)或手动转义。


四、CSS 中的特殊字符

CSS 选择器和属性值中也存在大量具有特殊含义的字符。

1. 选择器中的特殊字符

字符含义示例
#ID 选择器#header
.类选择器.btn-primary
:伪类:hover, :nth-child(2)
::伪元素::before, ::selection
[ ]属性选择器[type="text"]
>子代选择器div > p
+相邻兄弟h1 + p
~通用兄弟h1 ~ p
(空格)后代选择器div p
*通配符* { margin: 0; }

⚠️ 警告:如果类名或 ID 包含这些字符(如 .btn:hover),必须转义:

.btn\:hover { color: red; }
.class\u007Bname { font-weight: bold; } /* { 转义为 \u007B */

2. 属性值中的特殊字符

  • "':字符串值边界,注意嵌套。
  • ():函数调用,如 url("image.png")rgb(255,0,0)calc(100% - 20px)
  • ;:声明结束符。
  • {}:规则块边界。
  • @:at-rule 开始,如 @media@keyframes

五、URL 中的特殊字符(Percent-Encoding)

URL 由多个部分组成(协议、主机、路径、查询、锚点),每个部分对字符的合法性要求不同。

1. 需要编码的保留字符

字符编码所在位置说明
(空格)%20+查询参数中可用 +
#%23路径、查询中锚点分隔符
?%3F路径中查询字符串开始
&%26查询中参数分隔符
=%3D查询中键值分隔符
%%25所有位置百分号自身
<, >%3C, %3E所有位置避免与 HTML 混淆
", '%22, %27所有位置
{, }%7B, %7D所有位置
`, `, ^, `%7C, %5C, %5E, %60所有位置

2. 编码方法

  • JavaScript
    encodeURIComponent("hello world@site.com"); // "hello%20world%40site.com"
    decodeURIComponent("%E2%9C%94"); // "✔"
    
  • 避免使用 escape()unescape()(已废弃)。

六、JSON 中的特殊字符

JSON 是前后端数据交换的标准格式,其字符串值中的某些字符必须转义。

必须转义的字符:

字符转义形式示例
"\""He said \"Hello\""
\\\"C:\\path\\file"
/\/可选,用于避免 </script> 问题
\b\b退格符
\f\f换页符
\n\n换行符
\r\r回车符
\t\t制表符
\uXXXXUnicode"\u00A9" → “©”

最佳实践:使用 JSON.stringify()JSON.parse() 自动处理转义。


七、安全敏感字符与 XSS 防护

以下字符组合可能被用于跨站脚本攻击(XSS),必须严格过滤或转义:

  • <script>alert(1)</script>
  • <img src=x onerror=alert(1)>
  • <a href="javascript:alert(1)">Click</a>
  • <svg onload=alert(1)>
  • data:text/html,<script>alert(1)</script>

防护策略:

  1. 输入验证:对用户输入进行白名单过滤。
  2. 输出转义
    • HTML 上下文:转义 <, >, &, ", '
    • JavaScript 上下文:使用 \ 转义
    • URL 上下文:使用 encodeURIComponent
  3. 使用现代框架
    • React 默认转义 JSX 中的变量。
    • Vue 使用 {{ }} 插值自动转义。
  4. 内容安全策略(CSP):通过 HTTP 头限制脚本执行来源。

八、其他常见特殊字符

字符名称HTML 实体Unicode
αAlpha&alpha;\u03B1
βBeta&beta;\u03B2
πPi&pi;\u03C0
左箭头&larr;\u2190
右箭头&rarr;\u2192
, 上/下箭头&uarr;, &darr;\u2191, \u2193
实心圆点&bull;\u2022
省略号&hellip;\u2026
千分号&permil;\u2030
½二分之一&frac12;\u00BD

九、最佳实践总结

场景推荐方法
HTML 文本输出使用 textContent 或模板引擎自动转义
JavaScript 字符串使用模板字符串或 \ 转义
URL 参数拼接使用 encodeURIComponent()
CSS 类名处理避免特殊字符,必要时用 \ 转义
JSON 数据处理使用 JSON.stringify() / JSON.parse()
用户输入处理输入验证 + 输出转义 + CSP
国际化文本统一使用 UTF-8 编码

参考资料

  • MDN Web Docs: HTML entities
  • ECMAScript Specification: Escape Sequences
  • OWASP: XSS Prevention Cheat Sheet
http://www.dtcms.com/a/535782.html

相关文章:

  • 【超音速专利 CN119515970A】一种适用于电池极片的边缘点距离处理方法、系统及平台
  • CANoe基础讲解04:掌握CANoe Graphics窗口(二)
  • 外国域名注册很多网站制作灯笼的手工做法步骤
  • Spring MVC配置解决跨域请求
  • 从一个nginx镜像启动的容器中分出部分location配置到另外一个nginx容器
  • 探秘仓颉:当函数式编程遇见面向对象王国,当协程风暴席卷并发荒原——从基础语法到实战测试联动的多维编程奇遇记
  • (场景题)怎么实现数据的批量插入?
  • 网站建设与管理案例...建企业网站一般需要多少钱
  • 使用el-table时,某个字段对应多个key值,如何进行展示
  • 空间数据采集与管理(如何使用ArcGIS Pro和Python进行空间数据的管理,确保数据采集和组织的高效性和准确性)
  • WHAT - React Compiler Directives 让手动优化变成过去式
  • API请求关键指标全解:Apipost视角下,从连接到性能的全景分析
  • HTML 的底层原理
  • 布吉做网站的公司关于网站建设的图片
  • 服务器运维(六)网站访问分析统计——东方仙化神期
  • 【Docker】定制化构建一个可以运行GaussDB的kylinv10sp3系统的docker镜像
  • 5分钟搭建云IDE!CodeServer+cpolar打造跨设备开发工作站
  • vmware和kali linux安装和搭建
  • 网络:网络层(IP协议)和数据链路层
  • DDS和SOMEIP区别以及应用场景
  • Lumi 具神智能机器人 SDK说明和ACT算法中的学习与推理
  • Rokid AR眼镜开发入门:构建智能演讲提词器Android应用
  • 量化指标解码03:布林带的开口收口策略与市场波动性分析
  • 深圳网站建设报价表廊坊建手机网站
  • 余姚网站推广wordpress多个域名
  • CSS引入方式(本文为个人学习笔记,内容整理自哔哩哔哩UP主【非学者勿扰】的公开课程。 > 所有知识点归属原作者,仅作非商业用途分享)
  • SuperMap iObjects .NET 11i 二次开发(十六)—— 叠加分析之合并
  • 【Linux笔记】网络部分——传输层协议UDP
  • Ansible 自动化项目结构与 Harbor 安装示例(基于 kubeasz)①
  • Spring 源码学习(十五)—— HandlerMethodReturnValueHandler