【问题标题】:Mongoid and UTF-8 issues in a JRuby on Rails appJRuby on Rails 应用程序中的 Mongoid 和 UTF-8 问题
【发布时间】:2011-12-13 19:39:48
【问题描述】:

我正在获取一个 JSON 字符串,它是轮询 Foursquare 场地 API 的结果:

{
    "id"=>"4e404742c65b4ec27606deb4",
    "name"=>"Sarah's Cheesecake & Cafe",
    "contact"=>{
        "phone"=>"4134436678",
        "formattedPhone"=>"(413) 443-6678"
    },
    "location"=>{
        "address"=>"180 Elm St",
        "lat"=>42.44345873,
        "lng"=>-73.23804678,
        "distance"=>1063,
        "postalCode"=>"01201",
        "city"=>"Pittsfield",
        "state"=>"MA"
    },
    "categories"=>[
        {
            "id"=>"4bf58dd8d48988d16d941735",
            "name"=>"Café",
            "pluralName"=>"Cafés",
            "shortName"=>"Café",
            "icon"=>{
                "prefix"=>"https://foursquare.com/img/categories/food/cafe_",
                "sizes"=>[
                    32,
                    44,
                    64,
                    88,
                    256
                ],
                "name"=>".png"
            },
            "primary"=>true
        }
    ],
    "verified"=>false,
    "stats"=>{
        "checkinsCount"=>7,
        "usersCount"=>5,
        "tipCount"=>0
    },
    "hereNow"=>{
        "count"=>0
    }
}

如您所知,其中有一些非标准字符,例如 Cafés,这破坏了我在这个 JRuby on Rails 应用程序中基于 Mongoid 的模型。尝试使用 MyModel.create 创建实例时,我得到了以下结果。

jruby-1.6.5 :012 > FoursquareVenue.create(hash)
Java::JavaLang::NullPointerException: 
    from org.jruby.exceptions.RaiseException.<init>(RaiseException.java:101)
    from org.jruby.Ruby.newRaiseException(Ruby.java:3348)
    from org.jruby.Ruby.newEncodingCompatibilityError(Ruby.java:3323)
    from org.jruby.RubyString.cat(RubyString.java:1285)
    from org.jruby.RubyString.cat19(RubyString.java:1221)
    from org.jruby.RubyHash$5.visit(RubyHash.java:727)
    from org.jruby.RubyHash.visitAll(RubyHash.java:594)
    from org.jruby.RubyHash.inspectHash(RubyHash.java:721)
    from org.jruby.RubyHash.inspect(RubyHash.java:745)
    from org.jruby.RubyHash$i$0$0$inspect.call(RubyHash$i$0$0$inspect.gen:65535)
    from org.jruby.RubyClass.finvoke(RubyClass.java:632)
    from org.jruby.javasupport.util.RuntimeHelpers.invoke(RuntimeHelpers.java:545)
    from org.jruby.RubyBasicObject.callMethod(RubyBasicObject.java:353)
    from org.jruby.RubyObject.inspect(RubyObject.java:408)
    from org.jruby.RubyArray.inspectAry(RubyArray.java:1483)
    from org.jruby.RubyArray.inspect(RubyArray.java:1509)
... 420 levels...
    from org.jruby.evaluator.ASTInterpreter.INTERPRET_METHOD(ASTInterpreter.java:75)
    from org.jruby.internal.runtime.methods.InterpretedMethod.call(InterpretedMethod.java:190)
    from org.jruby.internal.runtime.methods.DefaultMethod.call(DefaultMethod.java:179)
    from org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:312)
    from org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:169)
    from usr.local.rvm.rubies.jruby_minus_1_dot_6_dot_5.bin.jirb.__file__(/usr/local/rvm/rubies/jruby-1.6.5/bin/jirb:17)
    from usr.local.rvm.rubies.jruby_minus_1_dot_6_dot_5.bin.jirb.load(/usr/local/rvm/rubies/jruby-1.6.5/bin/jirb)
    from org.jruby.Ruby.runScript(Ruby.java:693)
    from org.jruby.Ruby.runScript(Ruby.java:686)
    from org.jruby.Ruby.runNormally(Ruby.java:593)
    from org.jruby.Ruby.runFromMain(Ruby.java:442)
    from org.jruby.Main.doRunFromMain(Main.java:321)
    from org.jruby.Main.internalRun(Main.java:241)
    from org.jruby.Main.run(Main.java:207)
    from org.jruby.Main.run(Main.java:191)
    from org.jruby.Main.main(Main.java:171)

如果我去掉所有奇数字符,一切都会按预期进行,并且不会引发异常。处理这个的正确方法是什么?我可以让我的 Mongoid/MongoDB 文档使用 UTF-8 吗?如果不可能,我是否需要先以某种方式“asciify”它们?

【问题讨论】:

    标签: ruby-on-rails mongodb jruby mongoid foursquare


    【解决方案1】:

    可能是 JRuby 1.9 模式中的编码错误。当你在 1.8 模式下运行它时会发生同样的事情吗?无论哪种方式,堆栈跟踪都应该作为错误提交到http://bugs.jruby.org。谢谢!

    【讨论】:

    • 嗨尼克,我仍然在 1.8 模式下运行所有​​东西:jruby 1.6.5 (ruby-1.8.7-p330) (2011-10-25 9dcd388) (OpenJDK 64-Bit Server VM 1.6 .0_20) [linux-amd64-java]
    【解决方案2】:

    gem install bson_ext 可能会有所帮助。

    来源:MongoDB, Ruby and UTF-8

    如果您使用的是 ubuntu,那么您需要在 spidermonkey/mongodb 安装中执行一些额外的步骤:

    大多数预构建的 Javascript SpiderMonkey 库没有 UTF-8 支持编译; MongoDB 需要这个。

    来源:Building for Linux

    【讨论】:

    • 不,这在我的 prod 环境 (RHEL) 和 staging (OSX Lion) 上都可以重现
    • 两种安装场景,在安装mongodb的时候,一定要勾选-utf-8 enabled。
    • 其实我收回了。这不再在 OSX 上重现。仅在我的 RHEL 盒子上。使用完全相同的宝石套装。
    • 然后尝试按照上面记录的说明进行操作,这可能是问题所在。
    • 我正在使用 10gen 提供的预构建二进制文件。真的没有理由编译我自己的。有没有办法检查预编译的二进制文件是否内置了 utf-8 支持?
    【解决方案3】:

    MongoDB 和 mongoid 正确处理 utf-8。不久前,我通过 Quimby 包装器使用 Foursquare API 做同样的事情。

    因此,我怀疑这个错误与 JRuby 的使用密切相关。

    【讨论】:

      【解决方案4】:

      您是否已将 JRuby 设置为使用 UTF8?

      require 'jcode'
      $KCODE = 'u'
      

      【讨论】:

        猜你喜欢
        • 2017-05-26
        • 2011-03-18
        • 2011-04-22
        • 1970-01-01
        • 1970-01-01
        • 2012-03-18
        • 1970-01-01
        • 2015-07-12
        • 1970-01-01
        相关资源
        最近更新 更多