RubyのHashとArrayの文字列要素をforce_encoding
RubyのHashとArrayの文字列要素を再帰的にforce_encoding
する
def encoding_hash(hash, encode = Encoding::UTF_8) hash&.map do |k, v| case v when Hash then [k, encoding_hash(v, encode)] when Array then [k, encoding_array(v, encode)] when String then [k, v.force_encoding(encode)] else [k, v] end end&.to_h end def encoding_array(array, encode = Encoding::UTF_8) array&.map do |v| case v when Hash then encoding_hash(v, encode) when Array then encoding_array(v, encode) when String then v.force_encoding(encode) else v end end end
もしくは関数にするよりオープンクラスにしたほうがいいかもしれない
class Hash def encoding(encode = Encoding::UTF_8) map do |k, v| case v when Hash, Array then [k, v.encoding(encode)] when String then [k, v.force_encoding(encode)] else [k, v] end end&.to_h end end class Array def encoding(encode = Encoding::UTF_8) map do |v| case v when Hash, Array then v.encoding(encode) when String then v.force_encoding(encode) else v end end end end
Thanks for reading!