{"record":{"id":"9e8db4840abf1799","repo":"Shopify/liquid","slug":"invalid-byte-sequence-in-result-encoding","errorCode":null,"errorMessage":"invalid byte sequence in #{result.encoding}","messagePattern":"invalid byte sequence in #(.+?)","errorType":"exception","errorClass":"Liquid::ArgumentError","httpStatus":null,"severity":"error","filePath":"lib/liquid/standardfilters.rb","lineNumber":150,"sourceCode":"    # @liquid_syntax string | url_encode\n    # @liquid_return [string]\n    def url_encode(input)\n      CGI.escape(Utils.to_s(input)) unless input.nil?\n    end\n\n    # @liquid_public_docs\n    # @liquid_type filter\n    # @liquid_category string\n    # @liquid_summary\n    #   Decodes any [percent-encoded](https://developer.mozilla.org/en-US/docs/Glossary/percent-encoding) characters\n    #   in a string.\n    # @liquid_syntax string | url_decode\n    # @liquid_return [string]\n    def url_decode(input)\n      return if input.nil?\n\n      result = CGI.unescape(Utils.to_s(input))\n      raise Liquid::ArgumentError, \"invalid byte sequence in #{result.encoding}\" unless result.valid_encoding?\n\n      result\n    end\n\n    # @liquid_public_docs\n    # @liquid_type filter\n    # @liquid_category string\n    # @liquid_summary\n    #   Encodes a string to [Base64 format](https://developer.mozilla.org/en-US/docs/Glossary/Base64).\n    # @liquid_syntax string | base64_encode\n    # @liquid_return [string]\n    def base64_encode(input)\n      Base64.strict_encode64(Utils.to_s(input))\n    end\n\n    # @liquid_public_docs\n    # @liquid_type filter\n    # @liquid_category string","sourceCodeStart":132,"sourceCodeEnd":168,"githubUrl":"https://github.com/Shopify/liquid/blob/807d45a6b3d4568e64e86b375e3702df2c7c860c/lib/liquid/standardfilters.rb#L132-L168","documentation":"The url_decode Liquid filter raises Liquid::ArgumentError when CGI.unescape produces a string whose bytes are invalid in the result's encoding. This happens when percent-decoding yields bytes that don't form valid characters (e.g. invalid UTF-8 sequences).","triggerScenarios":"Calling {{ '%FF%FE' | url_decode }} or similar with percent escapes that decode to bytes invalid for the string encoding (commonly invalid UTF-8).","commonSituations":"Decoding URL-encoded binary data that isn't UTF-8; double-encoded or corrupted query strings from external systems; legacy percent-encodings of non-UTF-8 charsets (e.g. Latin-1 bytes).","solutions":["Fix the input so percent escapes represent valid UTF-8 sequences (re-encode the source as UTF-8 before percent-encoding)","Sanitize/strip invalid percent sequences from the input before applying the filter","If binary data must round-trip, use base64 encoding instead of url encoding"],"exampleFix":"<!-- before -->\n{{ '%FF' | url_decode }}\n<!-- after -->\n{{ '%C3%BF' | url_decode }}","handlingStrategy":"validation","validationCode":"def url_decodable?(s)\n  decoded = CGI.unescape(s.to_s)\n  decoded.valid_encoding?\nend","typeGuard":"def valid_encoding_string?(v)\n  v.is_a?(String) && CGI.unescape(v).valid_encoding?\nend","tryCatchPattern":"begin\n  output = Liquid::Template.parse(tpl).render(assigns)\nrescue Liquid::ArgumentError => e\n  raise unless e.message.start_with?('invalid byte sequence')\n  # sanitize input and retry or use fallback\nend","preventionTips":["Percent-encode UTF-8 sources correctly before decoding","Reject suspicious encoded input at ingestion","Prefer base64 for binary round-trips","Test filters with edge-case encodings"],"tags":["liquid","template-engine","encoding","url-decode","utf-8"],"backgroundTag":"invalid-encoding","analyzedSha":"807d45a6b3d4568e64e86b375e3702df2c7c860c","analyzedAt":"2026-09-08T11:31:38.917Z","contentChangedAt":"2026-09-08T11:31:38.917Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}