pymongo保存snappy压缩数据

在使用python snappy压缩以后的数据,保存到mongo时报字符串编码错误,错误内容和下面的差不多:

bson.errors.InvalidStringData
strings in documents must be valid UTF-8

这时候可以使用bson binary格式来保存这类数据:

以上,希望能对你起到帮助。

sinatra “incompatible character encodings: ASCII-8BIT and UTF-8”问题

使用sinatra的时候出现了“incompatible character encodings: ASCII-8BIT and UTF-8”报错。这个应用是使用haml并且在haml里使用markdown方法去读markdown文件来作为模板解决方案的,如果Tilt读取haml是一种编码格式而rdiscount读取markdown是另一种编码,应该会产生这问题,于是google了一下,找到如下一个解答:

Incompatible character encoding in simple Sinatra app

其原因大概是Tilt使用了IO.binread读取后编码为ASCII-8BIT,而RDiscount则读取文件后转换为需要的编码格式,但如果需要的格式是ASCII-8BIT时就会失败,它直接把utf-8编码的字符串传给了Tilt。此类问题出现在ruby1.9+的版本上。可以通过使用File.read代替Tilt默认的IO.binread,或者读取完后强制转换成你需要的编码格式:

示例代码:

示例中使用的是erb模板,haml也是一样的,我使用force_encoding的解决方案,运行通过。

我遇到问题时各个包版本如下:

  • ruby:2.0.0
  • Tilt:1.3.6
  • rdiscount:2.0.7.1

我的某个服务器就没出现这问题,应该是和某些版本有关的。