NodeJS处理非ASCII字符串:编码判断、字符提取与ASCII转换
Node.js + Puppeteer 爬取非ASCII货币字符串处理方案
我正在用Node.js和Puppeteer做网页爬取,拿到的数据示例如下:
{ "priceValue": "£20,000" }
因为首字符£是非ASCII字符,需要解决三个问题:
1. 判断字符串编码/字符宽度
Node.js里所有字符串默认都是UTF-16编码,你可以用Buffer验证编码兼容性:
const str = "£20,000"; const buffer = Buffer.from(str); console.log(buffer.toString('utf8') === str); // 输出true,说明UTF-8编码兼容
字符宽度方面,£是单码点字符,用codePointAt()能直接获取它的Unicode码点:
console.log(str.codePointAt(0)); // 输出163,对应英镑符号的Unicode值
如果要判断字符的显示宽度(区分全角/半角),可以用Intl.Segmenter:
const segmenter = new Intl.Segmenter('en', { granularity: 'grapheme' }); const segments = Array.from(segmenter.segment(str)); console.log(segments[0].segment.length); // 输出1,说明是单宽度字符
2. 提取首字符并添加货币字段
直接提取首字符做判断,再处理数值和新增字段:
const rawData = { priceValue: "£20,000" }; const currencySymbol = rawData.priceValue.charAt(0); if (currencySymbol === '£') { // 提取数值:去掉符号和千分位逗号,转成数字 const numericPrice = rawData.priceValue.slice(1).replace(/,/g, ''); rawData.priceValue = parseFloat(numericPrice); // 添加货币代码字段 rawData.priceCurrency = 'GBP'; } console.log(rawData); // 输出:{ priceValue: 20000, priceCurrency: 'GBP' }
如果要兼容更多货币符号,直接扩展if条件或者用对象映射就行,比如const symbolMap = { '£': 'GBP', '$': 'USD' }。
3. 转换剩余内容为ASCII格式
示例里的剩余内容20,000本身就是ASCII字符,直接使用即可。如果遇到其他非ASCII的数字/分隔符,用Unicode归一化+正则过滤:
const remainingPart = rawData.priceValue.slice(1); // 归一化后过滤非ASCII字符 const asciiStr = remainingPart.normalize('NFKD').replace(/[^\x00-\x7F]/g, ''); console.log(asciiStr); // 输出"20,000"
内容的提问来源于stack exchange,提问作者user2138149
相关产品推荐
相关产品推荐

