Node.js基于iconv-lite实现输入字符串按选中字符集转换问题
字符集转换功能代码调整方案
原代码存在以下核心问题:
- 响应流程错误:调用
res.sendFile后响应已经被终止,后续的res.send内容不会返回给前端 - 转换后的数据没有绑定到返回的页面元素中,前端看不到转换结果
- 直接对
iconv.encode返回的Buffer调用toString()默认采用UTF-8解码,无法正确呈现对应字符集的编码结果
以下是修改后的完整可运行代码:
const express = require('express'); const app = express(); const bodyParser = require('body-parser'); const iconv = require('iconv-lite'); const urlencodedParser = bodyParser.urlencoded({ extended: false }); // 公共页面渲染函数,统一处理页面结构和结果填充 function renderPage(input = '', isoResult = '', utf8Result = '', winResult = '') { return ` <!DOCTYPE html> <html> <head><meta charset="UTF-8"></head> <body> <form method="POST" action="/"> <div>输入字符串:<input name="input" value="${input}" required></div> <button type="submit">转换</button> </form> <br> <div>输入字符串:<textarea rows="3" cols="50" readonly>${input}</textarea></div> <div>ISO-8859-1 编码结果(十六进制):<textarea rows="3" cols="50" readonly>${isoResult}</textarea></div> <div>UTF-8 编码结果(十六进制):<textarea rows="3" cols="50" readonly>${utf8Result}</textarea></div> <div>Windows-1252 编码结果(十六进制):<textarea rows="3" cols="50" readonly>${winResult}</textarea></div> </body> </html> ` } app.get('/', function(req, res) { res.send(renderPage()); }); app.post('/', urlencodedParser, function(req, res) { const input = req.body.input || ''; // 编码后转十六进制展示,避免乱码问题,也可以根据需求改为toString('base64')输出base64格式 const utf8 = iconv.encode(input, 'utf-8').toString('hex'); const iso = iconv.encode(input, 'iso-8859-1').toString('hex'); const win = iconv.encode(input, 'win1252').toString('hex'); // 直接返回带转换结果的页面,不要混用sendFile和send res.send(renderPage(input, iso, utf8, win)); }); app.listen(3000, () => { console.log('服务运行在 http://localhost:3000'); });
如果需要直接展示对应编码的可视字符而非十六进制,可以将toString('hex')替换为对应编码的解码逻辑,比如iconv.decode(iconv.encode(input, 'iso-8859-1'), 'iso-8859-1'),但要注意如果输入字符不在目标字符集的支持范围内会出现乱码。
内容的提问来源于stack exchange,提问作者Вадим Иващенко
相关产品推荐
相关产品推荐

