Ruby on Rails Encoding::UndefinedConversionError(“\xF8”从 ASCII-8BIT 到 UTF-8)

Ruby on Rails Encoding::UndefinedConversionError ("\xF8" from ASCII-8BIT to UTF-8)

我看到了一堆主题相似的问题,但找不到解决问题的方法。希望有人能帮忙。

我在 Rails 应用程序上有一个 Ruby。在此应用程序中,我有一些 base64 数据,我想将其解码并写入文件中。当我有一个通过 ruby myFile.rb 调用的小脚本时,程序会按预期运行。然而,当我 运行 与 rails c 相同的代码时。我有以下错误:

Traceback (most recent call last):
        7: from (irb):1:in `<main>'
        6: from app/models/node.rb:1:in `<main>'
        5: from app/models/node_manager.rb:317:in `<main>'
        4: from app/models/node_manager.rb:255:in `convert_base64_to_file'
        3: from app/models/node_manager.rb:255:in `open'
        2: from app/models/node_manager.rb:255:in `block in convert_base64_to_file'
        1: from app/models/node_manager.rb:255:in `write'
Encoding::UndefinedConversionError ("\xF8" from ASCII-8BIT to UTF-8)

这是我的文件:

class I wrote in node_manager.rb
class NodeManager
class MacaroonInterceptor < GRPC::ClientInterceptor
    attr_reader :macaroon
  
    def initialize(macaroon)
      @macaroon = macaroon
      super
    end
  
    def request_response(request:, call:, method:, metadata:)
      metadata['macaroon'] = macaroon
      yield
    end
  
    def server_streamer(request:, call:, method:, metadata:)
      metadata['macaroon'] = macaroon
      yield
    end
end

def initialize(tls_path, macaroon_path, node_ip)
    @tls_path = tls_path
    @macaroon_path = macaroon_path
    @node_ip = node_ip
    @node = connect(@tls_path, @macaroon_path, @node_ip)
end

def connect(tls_path, macaroon_path, node_ip)
    certificate = File.read(File.expand_path(tls_path))
    credentials = GRPC::Core::ChannelCredentials.new(certificate)
    macaroon_binary = File.read(File.expand_path(macaroon_path))
    macaroon = macaroon_binary.each_byte.map { |b| b.to_s(16).rjust(2,'0') }.join
    if stub = Lnrpc::Lightning::Stub.new(
        node_ip,
        credentials,
        interceptors: [NodeManager::MacaroonInterceptor.new(macaroon)],
        channel_args: {"grpc.max_receive_message_length" => 1024 * 1024 * 50}
    )
        return stub
    else
        puts 'error'
        raise "Could not connect to the node"
    end
end

def get_info()
    begin
        node_info = @node.get_info(Lnrpc::GetInfoRequest.new())
        raise LoadError if !node_info
        return @node.get_info(Lnrpc::GetInfoRequest.new())
    rescue
        puts "could not connect to the node"
    end

end

# Class methods

def self.convert_base64_to_file(directory: nil, file_name:, base64data:)
    if directory
        file_path = [directory, file_name].join('/')
    else 
        file_path = file_name
    end
    file = File.open("file_name", 'w') {|f| f.write(Base64.decode64(base64data)) }

    return file_path
end
end

script I 运行 - 当我调用 ruby node_manager.rb 时有效,而不是当我使用 rails c

运行 时有效
admin_tls_base64 = "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNKekNDQWMyZ0F3SUJBZ0lSQUlWYzdlNHkxVGlpcHpmNWtHd09BUkF3Q2dZSUtvWkl6ajBFQXdJd01URWYKTUIwR0ExVUVDaE1XYkc1a0lHRjFkRzluWlc1bGNtRjBaV1FnWTJWeWRERU9NQXdHQTFVRUF4TUZZV3hwWTJVdwpIaGNOTWpFd056QTRNVEF5TmpFMFdoY05Nakl3T1RBeU1UQXlOakUwV2pBeE1SOHdIUVlEVlFRS0V4WnNibVFnCllYVjBiMmRsYm1WeVlYUmxaQ0JqWlhKME1RNHdEQVlEVlFRREV3VmhiR2xqWlRCWk1CTUdCeXFHU000OUFnRUcKQ0NxR1NNNDlBd0VIQTBJQUJMQ3B2eDdZb1ptZURIQVdjN0ozdmZTTUhPNEJhRnpMV0hJUXhJM2swaVJRS2xVVQpaSkdUcnFCQm1kU3AzcnNRMWsvSmtqOVlLZEVRMHVmcTdNeDBzcEdqZ2NVd2djSXdEZ1lEVlIwUEFRSC9CQVFECkFnS2tNQk1HQTFVZEpRUU1NQW9HQ0NzR0FRVUZCd01CTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME8KQkJZRUZJWlUrUHlTYVB0eFdOV0RqckJ5SUZuVXdTL0JNR3NHQTFVZEVRUmtNR0tDQldGc2FXTmxnZ2xzYjJOaApiR2h2YzNTQ0JXRnNhV05sZ2c1d2IyeGhjaTF1TWkxaGJHbGpaWUlFZFc1cGVJSUtkVzVwZUhCaFkydGxkSUlIClluVm1ZMjl1Ym9jRWZ3QUFBWWNRQUFBQUFBQUFBQUFBQUFBQUFBQUFBWWNFckJJQUFqQUtCZ2dxaGtqT1BRUUQKQWdOSUFEQkZBaUVBbDhnOERONStpRTA5c1ZZS2RoblExUmZWeWhhaTdLMG9xK2puV3NyNHpVNENJR2t6Nko4eQprTk4rSTRHT040UGNIWGN1QjRjWEt1aDJxVWFvd2IvZVBxV3YKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo="
admin_mac_base64= "AgEDbG5kAvgBAwoQ4MUVu75H5pCIGbg7qzbRfBIBMBoWCgdhZGRyZXNzEgRyZWFkEgV3cml0ZRoTCgRpbmZvEgRyZWFkEgV3cml0ZRoXCghpbnZvaWNlcxIEcmVhZBIFd3JpdGUaIQoIbWFjYXJvb24SCGdlbmVyYXRlEgRyZWFkEgV3cml0ZRoWCgdtZXNzYWdlEgRyZWFkEgV3cml0ZRoXCghvZmZjaGFpbhIEcmVhZBIFd3JpdGUaFgoHb25jaGFpbhIEcmVhZBIFd3JpdGUaFAoFcGVlcnMSBHJlYWQSBXdyaXRlGhgKBnNpZ25lchIIZ2VuZXJhdGUSBHJlYWQAAAYgzSSZTiO2yEt9aP+zP95czvfNNPgQXhyLNto2X1onfqQ="

admin_tls = NodeManager.convert_base64_to_file(file_name: "test_tls.cert", base64data: admin_tls_base64)
admin_mac = NodeManager.convert_base64_to_file(file_name: "test.macaroon", base64data: admin_mac_base64)

admin_node = NodeManager.new(admin_tls, admin_mac, '127.0.0.1:10001')
puts admin_node.get_info

感谢您的帮助,

一个简单的解决方案是为 File.write 函数赋予 'wb' 权限

def self.convert_base64_to_file(directory: nil, file_name:, base64data:)
if directory
    file_path = [directory, file_name].join('/')
else 
    file_path = file_name
end
file = File.open("file_name", 'w') {|f| f.write(Base64.decode64(base64data)) }

return file_path
end

希望对大家有所帮助!