当前位置:网站首页>&#x开头的是什么编码?
&#x开头的是什么编码?
2022-07-31 09:18:00 【会飞的胖达喵】
&#x开头的是什么编码?
在 Node 层利用 cheerio 解析网页时,输出的中文内容都是以 &#x 开头的一堆像乱码一样的东西,尝试过各种编码都无效,而且神奇的是,将这一堆“乱码”保存成网页后,通过浏览器打开又可以正常显示。这到底是什么??
缩减后的示例代码如下:
const cheerio = require('cheerio');
const $ = cheerio.load('<div id="content">你好</div>')
console.log($('#content').html()) //你好其实,上面那一堆乱码一样的东西,它的学名叫实体编码 entity code。
下面引用下知乎搜到的答案。
在 HTML 中,某些字符是预留的,例如小于号「<」、大于号「>」等,浏览器会将它们视作标签。如果想要在HTML中显示这些预留字符,我们就要用到字符实体(character entities)。我们比较熟悉的字符实体有空格「 」,小于号「<」,大于号「>」等。这样的格式比较语义化,容易记忆,但其实字符实体有其他的格式:
&name; &#dddd; &#xhhhh;
- 这三种转义方式都称作 character reference,第一种是 character entity reference,「&」符号后接预先定义好的 entity 名称。
- 后两种是 numeric character reference,数字取值为目标字符的 Unicode code point;以「&#」开头的后接十进制数字,「&#x」开头的后接十六进制数字。
从 HTML4 开始,numeric character reference 以 Unicode 为准,与文档编码无关。「你好」二字分别是 Unicode 字符 U+4F60 和 U+597D,十六进制表示的 code point 数值「4F60」和「597D」,同时也就是十进制的「20320」和「22909」。所以
在HTML中输入
你好 你好
都会显示为“你好”。
知道原因后,那么如何解决上述的问题呢?
方法一:使用cheerio提供的属性
cheerio默认会对entity进行decode,我们只需要关闭该功能即可
const cheerio = require('cheerio');
const $ = cheerio.load('<div id="content">你好</div>', { decodeEntities: false })
console.log($('#content').html()) // 你好方法二:手动decode

function decode(str) {
// 一般可以先转换为标准 unicode 格式(有需要就添加:当返回的数据呈现太多\\\u 之类的时)
str = unescape(str.replace(/\\u/g, "%u"));
// 再对实体符进行转义
// 有 x 则表示是16进制,$1 就是匹配是否有 x,$2 就是匹配出的第二个括号捕获到的内容,将 $2 以对应进制表示转换
str = str.replace(/&#(x)?(\w+);/g, function($, $1, $2) {
return String.fromCharCode(parseInt($2, $1? 16: 10));
});
return str;
}
边栏推荐
- OpenGL es 导读篇
- Job hunting product manager [9] How to write a good resume in job hunting season?
- Andoird开发--指南针(基于手机传感器)
- Doraemon teach you forwarded and redirect page
- Pytorch学习记录(七):自定义模型 & Auto-Encoders
- 傅里叶变换,拉普拉斯变换学习记录
- 02 Truffle TutorialToken 示例
- A Spark SQL online problem troubleshooting and positioning
- PyQt5快速开发与实战 9.4 Matplotlib在PyQt中的应用
- 让动画每次重复前都有延迟
猜你喜欢
随机推荐
How to restore data using mysql binlog
js implements the 2020 New Year's Day countdown bulletin board
刷题《剑指Offer》day06
MySQL 视图(详解)
文件的逻辑结构与物理结构的对比与区别
Hematemesis summarizes thirteen experiences to help you create more suitable MySQL indexes
【Unity】编辑器扩展-03-拓展Inspector视图
多版本node的安装与切换详细操作
qt在不同的线程中传递自定义结构体参数
零代码工具推荐 八爪鱼采集器
02 Truffle TutorialToken 示例
skynet中一条消息从取出到处理完整流程(源码刨析)
比较并交换 (CAS) 原理
关于挂载EXfat文件格式U盘失败的问题
Mysql+Navicat for Mysql
【Excel】生成随机数字/字符
loadrunner-controller-view script与load generator
Kotlin入门介绍篇
内联元素居中
2022 Hangzhou Electric Cup Super League 3









