Nodejs node-webkit 的乱码问题,求帮助

Nodejs node-webkit 的乱码问题,求帮助

node-webkit 页面里调用 Mongous 来操作数据库,updateinsert 中文会乱码,但是 find 出来的中文是正常显示的。

命令行里纯 node 用 Mongous 插入读取中文都是正常的。

所以的文件都是 utf-8 的,head 也是这样的 <meta charset="utf-8">


补充:发现一个奇怪的问题

a.text = '星期一' + (new Date()).getDay();
Mongo('test.write').insert(a);

这样插入的就是正常的 "text" : "星期一1"

a.text = '星期一1'; 
Mongo('test.write').insert(a);

这样就乱码了 "text" : "\u001ff\u001fg"


继续扩展

var day = ['日', '一', '二', '三', '四', '五', '六'];
a.text = '星期' + day[(new Date()).getDay()] ;
Mongo('test.write').insert(a);

也是正常显示的


真是莫名其妙,只要在原本的字符串后面再 + 上任意字符就可以避免这个问题了。Node-Webkit 中的 + 方法比较特殊?

目前的解决方法就是在写入前在字符串后面加上一个空格,然后在读取时 trim 一下。好像也只能这样了


8 回复

真是个奇怪的问题,node 除了 utf-8 都不支持别的编码,竟然还会乱码。

话说这个 Mongous 的作者也是搞笑啊,竟然还 jquery-like syntax。除了用了 dollar 符号之外,没看出哪里是 jquery-like 的。


Nodejs node-webkit 的乱码问题,求帮助

问题描述

在使用 node-webkit 页面 调用 Mongous 操作数据库时,updateinsert 中文会出现乱码,而通过 find 查询出来的中文则显示正常。而在 命令行里纯 node 使用 Mongous 插入和读取中文都是正常的。

所有的文件编码均为 UTF-8,并且 HTML 文件头部也设置了 <meta charset="utf-8">

补充信息

经过测试,发现了以下奇怪的现象:

// 正常情况
a.text = '星期一' + (new Date()).getDay();
Mongo('test.write').insert(a); // 插入结果为 "text" : "星期一1"
// 出现乱码
a.text = '星期一1'; 
Mongo('test.write').insert(a); // 插入结果为 "text" : "\u001ff\u001fg"

进一步测试后发现:

var day = ['日', '一', '二', '三', '四', '五', '六'];
a.text = '星期' + day[(new Date()).getDay()];
Mongo('test.write').insert(a); // 插入结果正常

这表明只要在原本的字符串后面再 + 上任意字符,就可以避免乱码问题。似乎 Node-Webkit 中的 + 运算符有特殊行为?

解决方案

目前的解决方案是在写入数据库之前,在字符串后面加上一个空格,然后在读取时使用 trim() 方法去除空格。

a.text = '星期一1 ' + (new Date()).getDay(); // 在字符串末尾添加空格
Mongo('test.write').insert(a);

// 读取数据时
Mongo('test.read').find({}).then(result => {
    result.forEach(doc => {
        doc.text = doc.text.trim(); // 去除空格
        console.log(doc.text);
    });
});

通过这种方法可以暂时解决乱码问题。希望有更好的解决方案或更深入的原因分析。


希望以上信息能够帮助你解决问题。如果还有其他疑问,欢迎继续讨论!

因为不需要的很复杂的数据库操作,所以选了一个很简单的驱动 jQuery-like 就是一噱头吧

我用 sublime text 2 ,保存的是 utf8 无 Bom

这个问题,,,我也遇到了,有解决了吗?

顶一下

根据你的描述,这个问题可能与字符串的编码处理方式有关。Mongous 库在某些情况下可能对字符串进行了不正确的编码处理。你提到的解决方法是在字符串后面加上一个空格,这确实可以作为一种临时解决方案。但更优雅的解决方法可能是确保所有字符串都以一致的方式进行编码。

解决方案

  1. 确保字符串使用 UTF-8 编码: 确保在插入数据库之前,所有的字符串都已经是 UTF-8 编码。你可以使用 Buffer 或其他方法来确保这一点。

  2. 使用模板字符串: 使用 ES6 模板字符串来拼接字符串,确保不会出现编码问题。

const Mongoous = require('mongous'); // 假设你已经安装并引入了 Mongous
const MongoClient = new Mongoous.MongoClient('mongodb://localhost:27017');

let a = {
    text: `星期${['日', '一', '二', '三', '四', '五', '六'][(new Date()).getDay()]}`,
};

MongoClient.connect((err, db) => {
    if (err) throw err;
    const collection = db.collection('test.write');
    collection.insertOne(a, (err, result) => {
        if (err) throw err;
        console.log(result);
        db.close();
    });
});
  1. 检查 MongoDB 配置: 确保 MongoDB 数据库的默认字符集设置为 UTF-8。你可以在创建数据库时指定字符集,或者在连接字符串中指定。
const MongoClient = new Mongoous.MongoClient('mongodb://localhost:27017/?charset=utf8mb4');

示例代码

const Mongoous = require('mongous');

// 创建 MongoDB 连接
const MongoClient = new Mongoous.MongoClient('mongodb://localhost:27017/?charset=utf8mb4');

// 创建一个对象
const a = {
    text: `星期${['日', '一', '二', '三', '四', '五', '六'][(new Date()).getDay()]}`,
};

// 连接到数据库
MongoClient.connect((err, db) => {
    if (err) throw err;
    const collection = db.collection('test.write');

    // 插入数据
    collection.insertOne(a, (err, result) => {
        if (err) throw err;
        console.log(result);
        db.close();
    });
});

通过这些方法,你应该能够避免乱码问题,并确保在 node-webkit 中插入和读取中文字符串时正常显示。

回到顶部