为什么'\x1B'.length === 1?\x与\u知识延伸

简介: 为什么'\x1B'.length === 1?\x与\u知识延伸

背景


先讲一下背景,再说原因


大多数库都会在日志中使用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相关的问题:“还原终端中log的彩色内容”

相关文章
|
传感器 安全 物联网
深入理解 Franca IDL 在 IPC 通信中的应用
深入理解 Franca IDL 在 IPC 通信中的应用
364 1
|
安全 数据安全/隐私保护
CSRF漏洞利用工具 -- CSRFTester
CSRF漏洞利用工具 -- CSRFTester
463 0
|
缓存 运维 监控
打造稳定高效的数据引擎:数据库服务器运维最佳实践全解析
打造稳定高效的数据引擎:数据库服务器运维最佳实践全解析
|
人工智能 编解码 5G
虚拟现实(VR)与增强现实(AR)的融合:开启全新交互时代
【6月更文挑战第17天】虚拟现实(VR)与增强现实(AR)融合成混合现实(MR),打造全新交互体验。MR结合VR的沉浸感和AR的现实增强,应用于教育、游戏、设计和营销,带来创新教学方式、沉浸式游戏体验和高效设计工具。尽管面临技术挑战,随着5G和AI的发展,MR有望引领未来交互的革命。
|
SQL 数据库 开发者
SQL 语言:完整性约束
SQL 语言:完整性约束
428 3
|
SQL JavaScript 安全
代码审查
【10月更文挑战第13天】
|
Java 关系型数据库 MySQL
【编程基础知识】Eclipse连接MySQL 8.0时的JDK版本和驱动问题全解析
本文详细解析了在使用Eclipse连接MySQL 8.0时常见的JDK版本不兼容、驱动类错误和时区设置问题,并提供了清晰的解决方案。通过正确配置JDK版本、选择合适的驱动类和设置时区,确保Java应用能够顺利连接MySQL 8.0。
1027 1
|
存储 SQL 监控
一文解读如何落地企业级云上日志审计方案
近年来,随着云计算的广泛应用和企业上云的深度普及,许多企业或个人用户将各种日志托管在云上进行留存,从而进行查询、审计等操作。什么是日志审计?为什么要做日志审计?企业如何落地云上日志审计方案?带着这些问题出发,本文将以阿里云日志服务(SLS)旗下的日志审计服务为视角切入,带领读者从当今网络安全形势和法律法规要求出发,解读云计算背景下,如何构建、运行、实践一个标准的企业级云上审计方案,从而更好地保障企业或组织的云上资产、云上数据的安全,确保企业业务持续安全稳定地运行。
|
消息中间件 弹性计算 运维
阿里云ECS事件通知产品详解
介绍阿里云ECS事件通知产品的详情和使用案例,包括控制台、OpenAPI、调试等。