背景

先讲一下背景,再说原因

大多数库都会在日志中使用chalk库为console的内容进行上色

chalk处理后,其原本的内容会被‘\x1B...’所包裹

console.log(chalk.blue('green'));
console.log([chalk.blue('green')]);

在开发vite-plugin-monitor时,为了获取原始的日志内容(上色之前),需要将上色后的字符串还原

\x1B[34mgreen\x1B[39m => green

在使用正则处理内容的时候发现了一个问题

'\x1B'.replace(/\\x/,'') // 结果??

通过.length查看其长度,结果就如标题所示

原因

反斜杠"\"通常标识转义字符,如\n(换行符),\t(制表符)

\x就标识16进制,后面跟上两位16进制数

与此同时还有\u也是标识16进制,但其后面需跟上4位16进制数

因此这里的\x1B实际上就是一个字符

'\x41' === 'A'   // true
'A' === '\u0041' // true

\x

\xhh匹配一个以两位十六进制数(\x00-\xFF)表示的字符

主要用于ASCII码的表示

'\x41' === ‘A’
'A' === String.fromCharCode(65) '\x61' === ‘a’
'a' === String.fromCharCode(97)

\x后必须跟着两位16进制的字符,否则会报错,其中 A-F 不区分大小写

'\x1' // Uncaught SyntaxError: Invalid hexadecimal escape sequence
'\xfg' // Uncaught SyntaxError: Invalid hexadecimal escape sequence

\u

\uhhhh匹配一个以四位十六进制数(\u0000-\uFFFF)表示的 Unicode 字符。

在正则表达式中常见于匹配中文字符

const r = /[\u4e00-\u9fa5]/
r.test('中文') // true
r.test('English') // false

常规字符与Unicode字符互转

str2Unicode

  1. 使用String.prototype.charCodeAt获取指定位置的 Unicode 码点(十进制表示)
  2. 使用String.prototype.toString将其转为十六进制字符,转为16进制字符不会自动补0
  3. 通过String.prototype.padStart进行补0

编写的通用处理方法如下

function str2Unicode(str) {
let s = ''
for (const c of str) {
s += `\\u${c.charCodeAt(0).toString(16).padStart(4, '0')}`
}
return s
} str2Unicode('1a中文') // '\\u0031\\u0061\\u4e2d\\u6587'

unicode2Str

  1. 通过正则/\\u[\da-f]{4}/g匹配出所有的unicode字符
  2. 使用Number0x${matchStr}转换为10进制数
  3. 使用String.fromCodePoint将unicode码点转为字符
  4. 使用String.prototype.replace进行逐字符的转换
function unicode2Str(str) {
const unicodeList = str.match(/\\u[\da-f]{4}/g) || []
return unicodeList.reduce((pre, u) => {
return pre.replace(u, String.fromCodePoint(Number(`0x${u.slice(2)}`)))
}, str)
} unicode2Str('1\\u0061\\u4e2d文') // 1a中文

还原chalk处理后的字符串

自己从0-1写一个正则难免会有许多边界情况考虑不周全,于是在chalk的README中找到了chalk/ansi-regex这个库

可以将色值相关的 ANSI转义码 匹配出来

import ansiRegex from 'ansi-regex';

'\u001B[4mcake\u001B[0m'.match(ansiRegex());
//=> ['\u001B[4m', '\u001B[0m'] '\u001B[4mcake\u001B[0m'.match(ansiRegex({onlyFirst: true}));
//=> ['\u001B[4m']

编写一下处理方法

function resetChalkStr(str) {
return str.replace(ansiRegex(), '')
}

测试

console.log(chalk.green('green'), chalk.greenBright('greenBright'));

console.log([chalk.green('green'), chalk.greenBright('greenBright')]);

console.log(resetChalkStr(`${chalk.green('green')} ${chalk.greenBright('greenBright')}`));

总结

重拾了一下\x\u相关的内容,突然额外想到一个点,使用\u去做字符串的加解密(下来再捋一捋)

解决了一个chalk相关的问题“还原终端中的彩色内容”

为什么'\x1B'.length===1?\x与\u知识延伸的更多相关文章

  1. 由MTK平台 mtkfb 设备注册疑问引发的知识延伸--ARM Device Tree

    问题: 在kernel-3.10\drivers\misc\mediatek\videox\mt6735\mtkfb.c里面int __init mtkfb_init(void) 有看到 platfo ...

  2. 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸

    类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...

  3. 由“如何取得CPU的温度与型号”学到的知识延伸WQL

    [Base]:WMI是一项核心的 Windows 管理技术:用户可以使用 WMI 管理本地和远程计算机.WQL就是 WMI 中的查询语言,翻译成中文好像可以成为 Windows 管理规范查询语言. 1 ...

  4. Javascript中关于cookie的那些事儿

    Javascript-cookie 什么是cookie? 指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密).简单点来说就是:浏览器缓存. cookie由什 ...

  5. C语言之通过冒泡排序浅谈编程思想

    写这篇博文的目的是想起到抛砖引玉的作用,还请大牛们留下一些先进的思想,让小菜学习一下.下面入正题. 复习C语言怎么能少的了冒泡呢,记得刚学C语言那会,感觉冒泡排序真的太复杂了,理解不大了,嗯!还是当时 ...

  6. 在.NET中使用JQuery 选择器精确提取网页内容

    1. 前言 相信很多人做开发时都有过这样的需求:从网页中准确提取所需的内容.思前想后,方法无非是以下几种:(本人经验尚浅,有更好的方法还请大家指点) 1. 使用正则表达式匹配所需元素.(缺点:同类型的 ...

  7. 前端笔记之JavaScript面向对象(一)Object&函数上下文&构造函数&原型链

    一.对象(Object) 1.1 认识对象 对象在JS中狭义对象.广义对象两种. 广义:相当于宏观概念,是狭义内容的升华,高度的提升,范围的拓展.狭义:相当于微观概念,什么是“狭”?因为内容狭隘具体, ...

  8. CTF中文件包含的一些技巧

    i春秋作家:lem0n 原文来自:浅谈内存取证 0x00 前言 网络攻击内存化和网络犯罪隐遁化,使部分关键数字证据只存在于物理内存或暂存于页面交换文件中,这使得传统的基于文件系统的计算机取证不能有效应 ...

  9. 【Python】torrentParser1.01

    在昨天的版本上做了一些改进,如增加getAll,修改getSingleFileName等 代码: #-------------------------------------------------- ...

随机推荐

  1. .net core api 对于FromBody的参数验证

    前言 在framework的mvc中,经常会使用 Model.State . ModelState.IsValid 配合着特性进行参数验证,通过这种方式可以降低controller的复杂度,使用方便. ...

  2. IDEA中的Git操作,看这一篇就够了!

    大家在使用Git时,都会选择一种Git客户端,在IDEA中内置了这种客户端,可以让你不需要使用Git命令就可以方便地进行操作,本文将讲述IDEA中的一些常用Git操作. 环境准备 使用前需要安装一个远 ...

  3. python matplotlib 绘图+显示数值

    参考:https://www.jb51.net/article/152685.htm 用plt.text函数 import numpy as np import matplotlib.mlab as ...

  4. 浅谈Java和Go的程序退出

    前言 今天在开发中对Java程序的退出产生了困惑,因为题主之前写过一段时间Go,这两者的程序退出逻辑是不同的,下面首先给出结论,再通过简单的例子来介绍. 对于Java程序,Main线程退出,如果当前存 ...

  5. GoLang设计模式05 - 原型模式

    原型模式也是一种创建型模式,它可以帮助我们优雅地创建对象的拷贝.在这种设计模式里面,将克隆某个对象的职责交给了要被克隆的这个对象.被克隆的对象需要提供一个clone()方法.通过这个方法可以返回该对象 ...

  6. python获取邮件信息

    在项目的Terminal中注册模块pypiwin32 python -m pip install pypiwin32 import win32com.client outlook = win32com ...

  7. SpringBoot 如何生成接口文档,老鸟们都这么玩的!

    大家好,我是飘渺. SpringBoot老鸟系列的文章已经写了两篇,每篇的阅读反响都还不错,果然大家还是对SpringBoot比较感兴趣.那今天我们就带来老鸟系列的第三篇:集成Swagger接口文档以 ...

  8. LayoutControl控件使用

    因默认外边距过大需要将外边距缩小用以下代码实现layoutControlGroup1.Padding = DevExpress.XtraLayout.Utils.Padding.Empty;是否允许只 ...

  9. 前后端数据交互(八)——请求方法 GET 和 POST 区别

    WEB 开发同学一看 get 和 post 请求方法的区别,第一感觉都是 So easy! 学习ajax.fetch.axios时,发送网络请求携带参数时,都需要分别处理get和post的参数.所以我 ...

  10. 深入理解Linux文件系统与日志文件

    目录: 一.inode与block 二.inode内容 三.inode的号码 四.inode的大小 五.链接文件 六.inode节点耗尽故障处理 七.恢复EXT类型的文件编译安装extundelete ...