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
希望对大家有所帮助!
我看到了一堆主题相似的问题,但找不到解决问题的方法。希望有人能帮忙。
我在 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
希望对大家有所帮助!