From d532a81bf95c48950e4cb7fcba3cd2cccf5933d7 Mon Sep 17 00:00:00 2001 From: Rabbit Date: Thu, 1 Aug 2024 11:49:09 +0800 Subject: [PATCH] fix: force encode spore cluster data (#2108) --- app/utils/ckb_utils.rb | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/app/utils/ckb_utils.rb b/app/utils/ckb_utils.rb index 38c555b08..1bce9c67e 100644 --- a/app/utils/ckb_utils.rb +++ b/app/utils/ckb_utils.rb @@ -614,15 +614,27 @@ def self.hexes_to_bins_sql(hex_strings) end def self.parse_spore_cluster_data(hex_data) - data = hex_data.slice(2..-1) - name_offset = [data.slice(8, 8)].pack("H*").unpack1("l") * 2 - description_offset = [data.slice(16, 8)].pack("H*").unpack1("l") * 2 - name = [data.slice(name_offset + 8..description_offset - 1)].pack("H*") - description = [data.slice(description_offset + 8..-1)].pack("H*") - name = "#{name[0, 97]}..." if name.length > 100 - { name:, description: } - rescue StandardError => _e - { name: nil, description: nil } + safe_encode = Proc.new do |str| + str.force_encoding("UTF-8").encode("UTF-8", invalid: :replace, undef: :replace, replace: "") + rescue Encoding::UndefinedConversionError, Encoding::InvalidByteSequenceError + "" + end + + begin + data = hex_data.slice(2..-1) + name_offset = [data.slice(8, 8)].pack("H*").unpack1("l") * 2 + description_offset = [data.slice(16, 8)].pack("H*").unpack1("l") * 2 + name = [data.slice(name_offset + 8..description_offset - 1)].pack("H*") + description = [data.slice(description_offset + 8..-1)].pack("H*") + name = "#{name[0, 97]}..." if name.length > 100 + name = safe_encode.call(name) + description = safe_encode.call(description) + + { name:, description: } + rescue StandardError => e + puts "Error parsing spore cluster data: #{e.message}" + { name: nil, description: nil } + end end def self.parse_spore_cell_data(hex_data)