nodejs解决中文字符浏览器不兼容(乱码)的终极办法(punycode)
发布于 2年前 作者 freemem 2172 次浏览

最近,为做一个浏览器插件,被字符不兼容的问题快搞死了。具体问题是从浏览器插件发起ajax跨域请求服务端内容,response的内容编辑是utf-8,在Firefox和Chrome下返回的结果都没有问题,但IE下中文是乱码. 这个问题实在太诡异。想尽一切办法最后最终找到以下解决途径: 首先用punycode.ucs2.decode方法将unicode string转为decimal code points,结果是一个数字数组。

var punycode = require('punycode');
app.get('/translate/:text/:from/:to', function(req, res){
    var translate = require('./translate.js');
    var text = req.params.text;
    var from = req.params.from;
    var to = req.params.to;
    res.charset = 'utf-8';
    translate.translate(text,from,to,function(err, data){
        res.send(punycode.ucs2.decode(data));
    });
});

这是最核心的一句:punycode.ucs2.decode(data) 然后在客户端将这个数组遍历,每个数字前加&#,后面加;,将其转为html字符实体:

function ParseChar(char){
    var result = '';
    for (i = 0; i < char.length; i++) {
        result += '&#' + char[i].toString() + ';';
    }
    return result;
}

这样得到的结果,就在任何浏览器下中文都不会有乱码了。

5 回复

你的主页面是gbk的?

不是,是utf-8

@freemem 那不会有问题的啊,这样转化浪费掉性能啊。

@suqian 真的有问题,不骗你,我不是传页面,是传text/plain,utf-8编码的内容。

检查下你的请求和响应的编码吧。

回到顶部