将中文保存到mongodb 2.4.8导致不可读的字符串

时间:2013-12-03 06:57:42

标签: java mongodb playframework

在我使用 Mongodb 2.0.6 之前,一切都很好。 最近我开始在Java Play框架中使用 Mongodb 2.4.8 ,我发现当我尝试将中文保存到mongodb时,mongodb实际存储为一些不可读的字符串,例如&\#21457;&\#29983;,在网上显示的是相同的字符串,有什么知道为什么?

我该怎么办?如何将其转换为可读的中文?

4 个答案:

答案 0 :(得分:6)

我认为,你的字符串会被转换为中间不可读的字符串。我在控制台上对此进行了测试,对我来说效果很好。

 $ mongo test
 MongoDB shell version: 2.4.8
 connecting to: test
 > var doc = { "message" :"你好" }
 > db.ChineseWord.save(doc)
 > db.ChineseWord.find().pretty()
 { "_id" : ObjectId("529da2018170273efa43e181"), "message" : "你好" }

答案 1 :(得分:3)

根据您发布的内容,我怀疑这可能是Play Framework的一个人工制品,因为这两个字符都可以直接存储在MongoDB中。

> db.test1.insert({x:" and "})
> db.test1.find();
{ "_id" : ObjectId("52a12237e7c9d6190f6feb95"), "x" : " and " }

假设您在上面发布的字符&#21457和&#29983确实是真的,那么我怀疑Play Framework正在将它们转换为扩展的unicode值的表示。在这种情况下,这两个字符将来自“CJK统一表意文字扩展B”部分。

您可以在此处查看整个字符集:http://codepoints.net/cjk_unified_ideographs_extension_b

这与Play-framework google群组中的here类似。

答案 2 :(得分:2)

我刚刚写了一个快速测试,这很好用。

package com.mongodb;

import com.mongodb.util.TestCase;
import org.junit.Assert;
import org.junit.Test;

public class EncodingTest extends TestCase {
    String chinese = "你好";

    @Test
    public void saveChinese() {
        DBCollection collection = getDatabase().getCollection("chinese");
        collection.insert(new BasicDBObject().append("message", chinese));
        DBObject object = collection.findOne();
        Assert.assertEquals(chinese, object.get("message"));
    }
}

该文本保存并加载且没有错误。这将有助于查看您用于测试的代码。

答案 3 :(得分:1)

虽然我没有专门针对Play框架的经验,但解决问题的一般方法是在传递给你的mongodb驱动程序之前尝试记录/转储这样的字符串,如果:

  1. 字符串仍然编码为utf-8,而非实体(&#...),您需要检查2.4的mongodb驱动程序是否更新了一些将utf-8转换为实体的新选项

  2. 如果字符串已经转换为实体,那么你至少要排除mongodb驱动程序,而应该在play框架中追踪转换。

  3. 正如其他人所提到的,mongodb本身并不关心你的输入是否是实体,只要它们是utf-8编码的。它更可能是游戏框架或mongodb驱动程序的责任。

    PS:我认为unreable表示它们已转换为实体(&#...),未编码错误。