将ASCII-8BIT格式转换为UTF-8时出现错误rails中的"\x90"

5
我正在一个Rails应用程序中制作API,但是似乎在编码方面遇到了一些问题。我真的不确定实际出现了什么错误。我编写了一个模块,其中有两个类。其中一个类用于获取域名的一些DNS记录。当我单独实例化该类并调用方法时,它可以正常工作,但是当我在我的Rails应用程序中运行时,会出现一个错误,提示“从ASCII-8BIT到UTF-8”的\x90。以下是我的类的部分内容:
#
# 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

以下是我的控制器代码:

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

我的类中的索引方法完全正常。我像这样查询我的api:http://api.lvh.me:3000/v1/dns/a/stackoverflow.com lvh.me 域是我使用的,以便我可以在本地使用子域名。 有人能看出可能的错误或对我有什么建议吗?
更新
我发现尝试不同的域会抛出不同的错误。 google.com 抛出: "\xF2" from ASCII-8BIT to UTF-8 facebook.com 抛出: "\xAD" from ASCII-8BIT to UTF-8 rubyonrails.org 抛出: "\xC0" from ASCII-8BIT to UTF-8

完整的错误信息(包括回溯)是什么?它来自你代码的哪一行? - matt
完整的错误跟踪在此处添加:https://gist.github.com/madsobel/3de776d8f53620423b2d,完整错误的屏幕截图可以在此处找到:http://ge.tt/80x2vBI2/v/0 - madsobel
有效的ASCII-8BIT值为0-127(0x00-0x7F)。 - Gumbo
我真的不明白这应该如何帮助? - madsobel
2个回答

0

这似乎也与您从Resolv接收到的原始地址格式有关。您每个八位组都会得到一个字节,因此我认为这也可以修复错误:

p = ress.map { |r| r.address.address.chars.map { |b| b.unpack 'C' }.join '.' }

不确定此时是否有帮助。

示例输出:

> 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\"]}}}"

-1

我不知道你是否希望将地址存储为字符串,例如“0.0.0.0”,还是以它们的原始形式作为已序列化的Resolv :: IPV4对象。就个人而言,我倾向于在JSON API中使用简单字符串,因此我认为我的答案会更有帮助。 - chad_

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接