Ruby on rails 3 Geokit Gem 1.5和Ruby 1.9.2=>&引用;不兼容字符编码:UTF-8和ASCII-8BIT“;
我目前正在使用最前沿的东西编写一个rails应用程序。Rails3、rSpec2、Ruby 1.9.2和Geokit 1.5.0。当我尝试对具有非ASCII-8Bit格式的特殊字符的地址进行地理编码时,会出现以下错误: 不兼容的字符编码: UTF-8和ASCII-8BIT 轨迹如下所示:Ruby on rails 3 Geokit Gem 1.5和Ruby 1.9.2=>&引用;不兼容字符编码:UTF-8和ASCII-8BIT“;,ruby-on-rails-3,ruby-1.9,geokit,rspec2,Ruby On Rails 3,Ruby 1.9,Geokit,Rspec2,我目前正在使用最前沿的东西编写一个rails应用程序。Rails3、rSpec2、Ruby 1.9.2和Geokit 1.5.0。当我尝试对具有非ASCII-8Bit格式的特殊字符的地址进行地理编码时,会出现以下错误: 不兼容的字符编码: UTF-8和ASCII-8BIT 轨迹如下所示: 1) Spot Basic Validations should calculate lat and lng Failure/Error: spot = Spot.create!({ incom
1) Spot Basic Validations should calculate lat and lng
Failure/Error: spot = Spot.create!({
incompatible character encodings: UTF-8 and ASCII-8BIT
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/geokit-1.5.0/lib/geokit/geocoders.rb:435:in `do_geocode'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/geokit-1.5.0/lib/geokit/geocoders.rb:126:in `geocode'
# ./app/models/spot.rb:26:in `geocode_address'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activesupport-3.0.0.rc/lib/active_support/callbacks.rb:409:in `_run_validation_callbacks'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activemodel-3.0.0.rc/lib/active_model/validations/callbacks.rb:53:in `run_validations!'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activemodel-3.0.0.rc/lib/active_model/validations.rb:168:in `valid?'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/validations.rb:55:in `valid?'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/validations.rb:75:in `perform_validations'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/validations.rb:49:in `save!'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/attribute_methods/dirty.rb:30:in `save!'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/transactions.rb:242:in `block in save!'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/transactions.rb:289:in `block in with_transaction_returning_status'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/connection_adapters/abstract/database_statements.rb:139:in `transaction'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/transactions.rb:204:in `transaction'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/transactions.rb:287:in `with_transaction_returning_status'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/transactions.rb:242:in `save!'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/validations.rb:34:in `create!'
# ./spec/models/spot_spec.rb:13:in `block (2 levels) in <top (required)>'
geo = Geokit::Geocoders::MultiGeocoder.geocode(CGI.escape(address))
1)现场基本验证应计算lat和lng
失败/错误:spot=spot.create!({
不兼容的字符编码:UTF-8和ASCII-8BIT
#/Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/geokit-1.5.0/lib/geokit/geocoders.rb:435:in'do_geocode'
#/Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/geokit-1.5.0/lib/geokit/geocoders.rb:126:in“地理编码”
#./app/models/spot.rb:26:in'geocode_address'
#/Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activesupport-3.0.0.rc/lib/active\u support/callbacks.rb:409:in`_run\u validation\u callbacks'
#/Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activemodel-3.0.0.rc/lib/active\u model/validations/callbacks.rb:53:in'run\u validations!'
#/Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activemodel-3.0.0.rc/lib/active_model/validations.rb:168:in“valid?”
#/Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/validations.rb:55:in'valid'
#/Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active\u record/validations.rb:75:in“perform\u validations”
#/Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/validations.rb:49:in'save!'
#/Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active\u record/attribute\u methods/dirty.rb:30:in'save!'
#/Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active\u record/transactions.rb:242:在“保存中的块”中
#/Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active\u record/transactions.rb:289:in`block in with_transaction\u returning\u status'
#/Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active\u record/connection\u adapters/abstract/database\u statements.rb:139:in'transaction'
#/Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/transactions.rb:204:in“transaction”
#/Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active\u record/transactions.rb:287:in“with\u transaction\u returning\u status”
#/Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/transactions.rb:242:in'save!'
#/Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/validations.rb:34:in'create!'
#./spec/models/spot_spec.rb:13:in'block(2层)in'
我在所有相关文件(规格、工厂和型号)中都使用了#coding:utf-8
,但当我使用像“Elsassers Straße 27”这样的地址时,就会出现这个错误
有什么提示吗?我想Geokit已经与1.9.1兼容了,因此与所有这些新的编码方式兼容了。你在使用Postgres和pg gem v0.8吗?升级到0.9吗?我知道这是一个非常晚的答案,但我已经为Geokit gem编写了一个Google geocoder,可以处理所有问题这个地理编码器使用谷歌地理编码服务的最新V3 API。优点是现在它不解析XML,而是JSON,速度更快,再加上所需的gem Yajl(ruby的一个超快速JSON解析器)要快得多。我的基准测试显示比旧方法快1.5倍左右
我知道这是一个非常晚的答案,但我已经为Geokit gem编写了一个Google geocoder,用于处理所有这些不兼容错误。该geocoder使用谷歌地理编码服务的最新V3 API。其优点是现在它不解析XML,而是解析JSON,后者更快,与所需的gem Yajl相匹配(一个用于ruby的超快速json解析器)的速度要快得多。我的基准测试显示,速度是旧方法的1.5倍
我也遇到了同样的问题,我通过添加CGI.escape()解决了这个问题,如下所示:
1) Spot Basic Validations should calculate lat and lng
Failure/Error: spot = Spot.create!({
incompatible character encodings: UTF-8 and ASCII-8BIT
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/geokit-1.5.0/lib/geokit/geocoders.rb:435:in `do_geocode'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/geokit-1.5.0/lib/geokit/geocoders.rb:126:in `geocode'
# ./app/models/spot.rb:26:in `geocode_address'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activesupport-3.0.0.rc/lib/active_support/callbacks.rb:409:in `_run_validation_callbacks'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activemodel-3.0.0.rc/lib/active_model/validations/callbacks.rb:53:in `run_validations!'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activemodel-3.0.0.rc/lib/active_model/validations.rb:168:in `valid?'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/validations.rb:55:in `valid?'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/validations.rb:75:in `perform_validations'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/validations.rb:49:in `save!'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/attribute_methods/dirty.rb:30:in `save!'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/transactions.rb:242:in `block in save!'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/transactions.rb:289:in `block in with_transaction_returning_status'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/connection_adapters/abstract/database_statements.rb:139:in `transaction'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/transactions.rb:204:in `transaction'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/transactions.rb:287:in `with_transaction_returning_status'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/transactions.rb:242:in `save!'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/validations.rb:34:in `create!'
# ./spec/models/spot_spec.rb:13:in `block (2 levels) in <top (required)>'
geo = Geokit::Geocoders::MultiGeocoder.geocode(CGI.escape(address))
我也遇到了同样的问题,我通过添加CGI.escape()解决了这个问题,如下所示:
1) Spot Basic Validations should calculate lat and lng
Failure/Error: spot = Spot.create!({
incompatible character encodings: UTF-8 and ASCII-8BIT
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/geokit-1.5.0/lib/geokit/geocoders.rb:435:in `do_geocode'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/geokit-1.5.0/lib/geokit/geocoders.rb:126:in `geocode'
# ./app/models/spot.rb:26:in `geocode_address'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activesupport-3.0.0.rc/lib/active_support/callbacks.rb:409:in `_run_validation_callbacks'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activemodel-3.0.0.rc/lib/active_model/validations/callbacks.rb:53:in `run_validations!'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activemodel-3.0.0.rc/lib/active_model/validations.rb:168:in `valid?'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/validations.rb:55:in `valid?'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/validations.rb:75:in `perform_validations'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/validations.rb:49:in `save!'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/attribute_methods/dirty.rb:30:in `save!'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/transactions.rb:242:in `block in save!'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/transactions.rb:289:in `block in with_transaction_returning_status'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/connection_adapters/abstract/database_statements.rb:139:in `transaction'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/transactions.rb:204:in `transaction'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/transactions.rb:287:in `with_transaction_returning_status'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/transactions.rb:242:in `save!'
# /Users/nilsriedemann/.rvm/gems/ruby-1.9.2-rc2/gems/activerecord-3.0.0.rc/lib/active_record/validations.rb:34:in `create!'
# ./spec/models/spot_spec.rb:13:in `block (2 levels) in <top (required)>'
geo = Geokit::Geocoders::MultiGeocoder.geocode(CGI.escape(address))
使用CGI.escape不是一个好主意,因为它会产生意想不到的结果。试试“挪威奥斯陆”,无论有没有CGI.escape,你都会明白我的意思 更好的解决方案是在以下位置使用Iconv:
ic = Iconv.new('US-ASCII//IGNORE', 'UTF-8')
utf8location = ic.iconv(location)
干杯
编辑:Wes Gamble建议我在这里编辑,我认为这是相关的:
使用//IGNORE
将删除任何非ASCII字符。但在许多(大多数)情况下,您可能希望对某些字符进行音译,例如umlauts(例如,“Zürich”将变成“Zurich”)或carons(例如“Niš”将变成“Nis”),以便成功地对它们进行地理编码。如果您忽略非ASCII字符,则“Zürich”将变成“Zrich”“Niš”将变成“Ni”,两者都不会成功地进行地理编码
你想用这个吗
ic = Iconv.new('US-ASCII//TRANSLIT', 'UTF-8')
请注意,如果音译无法完成,转换将引发异常,因此请确保您能够处理该异常。使用CGI.escape不是一个好主意,因为它会产生意外的结果。尝试使用或不使用CGI.escape的“挪威奥斯陆”,您将了解我的意思 更好的解决方案是在以下位置使用Iconv:
ic = Iconv.new('US-ASCII//IGNORE', 'UTF-8')
utf8location = ic.iconv(location)
干杯
编辑:Wes Gamble建议我在这里编辑,我认为这是相关的:
使用//IGNORE
将删除任何非ASCII字符。但在许多(大多数)情况下,您可能希望对某些字符进行音译,例如umlauts(例如,“Zürich”将变成“Zurich”)或carons(例如“Niš”将变成“Nis”),以便成功地对它们进行地理编码。如果您忽略非ASCII字符,则“Zürich”将变成“Zrich”“Niš”将变成“Ni”,两者都不会成功地进行地理编码