在我使用 Mongodb 2.0.6 之前,一切都很好。
最近我开始在Java Play框架中使用 Mongodb 2.4.8 ,我发现当我尝试将中文保存到mongodb时,mongodb实际存储为一些不可读的字符串,例如&\#21457;&\#29983;
,在网上显示的是相同的字符串,有什么知道为什么?
我该怎么办?如何将其转换为可读的中文?
答案 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驱动程序之前尝试记录/转储这样的字符串,如果:
字符串仍然编码为utf-8,而非实体(&#...),您需要检查2.4的mongodb驱动程序是否更新了一些将utf-8转换为实体的新选项
如果字符串已经转换为实体,那么你至少要排除mongodb驱动程序,而应该在play框架中追踪转换。
正如其他人所提到的,mongodb本身并不关心你的输入是否是实体,只要它们是utf-8编码的。它更可能是游戏框架或mongodb驱动程序的责任。
PS:我认为unreable
表示它们已转换为实体(&#...),未编码错误。