Nodejs 在 ubuntu12.04 上 express 中文乱码的问题

Nodejs 在 ubuntu12.04 上 express 中文乱码的问题

大家好。 我初学node.js, ubuntu12.04 64bit + node 0.10.30 + express 4.2.0 按照教材上的例子写的代码,返回来的json里面中文总是乱码。 写的js文件全部都是utf-8格式的。 请高手指导一下,是什么原因?是不是环境的问题? 非常感谢。

router.get('/', function(req, res) {
  //res.render('index', { title: 'Express' });
    if(!req.query.user){
        return res.json({code: 0, msg: '信息不完整'});
    }
    if (req.query.type && (["male", "female"].indexOf(req.query.type) === -1)) {
        return res.json({code: 0, msg: '类型错误'});
    }
    redis.pickBottle(req.query, function(result){
        res.json(result);
    })
});

3 回复

在 Ubuntu 12.04 上使用 Node.js 和 Express 处理中文时出现乱码问题,通常是因为字符编码设置不当。以下是解决这个问题的步骤和示例代码。

原因分析

  1. HTTP 响应头:确保 HTTP 响应头中设置了正确的字符编码(如 UTF-8)。
  2. 数据库编码:如果数据来自 Redis 或其他数据库,确保数据库和连接都使用 UTF-8 编码。
  3. 文件编码:确保所有文件(包括 JavaScript 文件)都是 UTF-8 编码。

解决方案

1. 设置响应头

在 Express 应用中,可以通过设置 Content-Type 响应头来指定字符编码为 UTF-8。

router.get('/', function(req, res) {
    res.set('Content-Type', 'application/json; charset=utf-8'); // 设置响应头

    if (!req.query.user) {
        return res.json({ code: 0, msg: '信息不完整' });
    }

    if (req.query.type && (["male", "female"].indexOf(req.query.type) === -1)) {
        return res.json({ code: 0, msg: '类型错误' });
    }

    redis.pickBottle(req.query, function(result) {
        res.json(result);
    });
});

2. 确保 Redis 连接使用 UTF-8 编码

如果你使用的是 redis 模块,可以确保在连接时设置字符编码:

var redis = require('redis');
var client = redis.createClient({
    return_buffers: false // 默认为 false,会自动处理字符串编码
});

client.on('error', function(err) {
    console.log('Redis error: ' + err);
});

3. 确保文件编码

确保你的 .js 文件是以 UTF-8 编码保存的。你可以在编辑器中进行设置,例如在 VSCode 中:

  • 打开文件
  • 点击右下角的编码信息(如 UTF-8
  • 选择 Reopen with Encoding
  • 选择 UTF-8

总结

通过设置响应头、确保 Redis 连接使用 UTF-8 编码以及确保文件编码为 UTF-8,可以有效解决 Node.js 在 Ubuntu 12.04 上使用 Express 时出现的中文乱码问题。希望这些步骤对你有所帮助!


你的浏览器记得用 chrome。 如果用了的话,看看浏览器是不是识别错了编码,纠正成 UTF-8。 如果要稳妥地解决问题。 使用这句 res.header("Content-Type", "application/json; charset=utf-8");

全局用法:

写个全局中间件,插入这句话:res.header("Content-Type", "application/json; charset=utf-8");

对于 Node.js 在 Ubuntu 12.04 上遇到的 Express 中文乱码问题,通常是因为编码设置不正确导致的。在 Node.js 和 Express 中处理 JSON 数据时,默认情况下不会出现编码问题,但如果你的输入数据(例如从数据库获取的数据)或者页面渲染过程中出现问题,则可能会出现乱码。

根据你的描述,JS 文件已经设置为 UTF-8 编码,并且代码看起来没有明显的编码问题。因此,重点检查以下几个方面:

  1. 确保 Redis 数据库中的数据是正确的编码

    • 如果你在 Redis 中存储了中文字符串,确保这些字符串是以 UTF-8 编码存储的。
    • 使用 redis.pickBottle 方法获取的数据应该已经是 UTF-8 编码的。
  2. 确保响应头中设置正确的字符编码

    • 可以在 Express 响应中显式地设置字符编码为 UTF-8,以确保客户端能够正确解析中文字符。

示例代码如下:

const express = require('express');
const router = express.Router();

router.get('/', function(req, res) {
    // 设置响应头的字符编码为 UTF-8
    res.set('Content-Type', 'application/json; charset=utf-8');

    if (!req.query.user) {
        return res.json({ code: 0, msg: '信息不完整' });
    }
    
    if (req.query.type && (["male", "female"].indexOf(req.query.type) === -1)) {
        return res.json({ code: 0, msg: '类型错误' });
    }

    redis.pickBottle(req.query, function(result) {
        res.json(result);
    });
});

module.exports = router;

通过设置 res.set('Content-Type', 'application/json; charset=utf-8') 来明确指定响应的内容类型和字符编码,可以有效避免中文乱码问题。如果问题仍然存在,请检查 Redis 数据库中的数据是否确实是 UTF-8 编码。

回到顶部