首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从ASCII-8位到UTF-8错误rails的“\X 90”

从ASCII-8位到UTF-8错误rails的“\X 90”
EN

Stack Overflow用户
提问于 2015-06-12 11:31:47
回答 2查看 1.8K关注 0票数 5

我正在Rails应用程序中创建一个API,但是我在编码方面遇到了一些问题,所以看起来是这样的。实际上,我不确定实际的错误是什么。我写了一个模块,里面有两个类。其中一个用于获取域的一些DNS记录。当我通过self实例化类并调用一个方法时,它工作得很好,但是当我在我的Rails应用程序中运行它时,我会被抛出一个错误:"\x90" from ASCII-8BIT to UTF-8

这是我班上的一点

代码语言:javascript
复制
#
# Class initializer to set instance variable with domain
#
def initialize(domain)
  @domain = domain
end

#
# Generates hash to be used in other methods
# @returns a hash with usefull info and made ready for later input
#
def generate_hash
  hash = {
    'timestamp' => Time.now.to_i,
    'credits_remaining' => 123,
    'response' => {
      'domain' => @domain,
      'records' => {}
    }
  }
  return hash
end

#
# Get A Records for a domain
# @returns JSON formatted hash
# 
def get_a_records
  data = self.generate_hash
  Resolv::DNS.open do |dns|
    ress = dns.getresources @domain, Resolv::DNS::Resource::IN::A
    p = ress.map { |r| r.address }
    data['response']['records']['a'] = p
  end
  return data.to_json
end

从我的控制员那里:

代码语言:javascript
复制
require 'domainapi'
class CallsController < ApplicationController

  def index
    render json: {'status': 'OK'}
  end

  def dns
    dns = DomainAPI::Dns.new(params[:domain])
    response = dns.get_a_records
    render json: response
  end

end

我们班的索引方法工作得很好。我像这个http://api.lvh.me:3000/v1/dns/a/stackoverflow.com一样查询我的api

lvh.me域是我使用的东西,所以我可以在本地使用子域。有人能看出错误可能是什么吗,或者对我能做什么有什么建议?

更新

我发现,尝试不同的领域,抛出不同的错误。google.com抛出:"\xF2" from ASCII-8BIT to UTF-8 facebook.com抛出:"\xAD" from ASCII-8BIT to UTF-8 rubyonrails.org thows:"\xC0" from ASCII-8BIT to UTF-8

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-15 10:12:45

所以,经过几个小时的努力找出问题所在,我已经解决了这个问题。

问题在于我试图将散列编码为JSON的部分。显然,Rails或我的应用程序不理解.to_json方法,所以我不得不使用JSON.generate(data)序列化,如下所述:http://ruby-doc.org/stdlib-2.0.0/libdoc/json/rdoc/JSON.html#module-JSON-label-Generating+JSON

票数 -1
EN

Stack Overflow用户

发布于 2015-06-18 19:48:21

它似乎也与从Resolv接收的原始地址的格式有关。地址的每个八进制都有一个字节,所以我认为这也解决了错误:

代码语言:javascript
复制
p = ress.map { |r| r.address.address.chars.map { |b| b.unpack 'C' }.join '.' }

不过,目前还不确定这是否有帮助。

示例输出:

代码语言:javascript
复制
> Resolv::DNS.open do |dns|
*   ress = dns.getresources 'www.example.com', Resolv::DNS::Resource::IN::A
*   p =  ress.map {|r| r.address.address.chars.map {|b| b.unpack 'C' }.join '.' }
*   data['response']['records']['a'] = p
* end

...

> data.to_json
=> "{\"response\":{\"records\":{\"a\":[\"93.184.216.34\"]}}}"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30802024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档