code: def _create_pax_generic_header(cls, pax_headers, type, encoding):
          
          # Check if one of the fields contains surrogate characters and thereby
          # forces hdrcharset=BINARY, see _proc_pax() for more information.
          binary = False
          for keyword, value in pax_headers.items():
              try:
                  value.encode("utf8", "strict")
              except UnicodeEncodeError:
                  binary = True
                  break
  
          records = b""
          if binary:
              # Put the hdrcharset field at the beginning of the header.
              records += b"21 hdrcharset=BINARY\n"
  
          for keyword, value in pax_headers.items():
              keyword = keyword.encode("utf8")
              if binary:
                  # Try to restore the original byte representation of `value'.
                  # Needless to say, that the encoding must match the string.
                  value = value.encode(encoding, "surrogateescape")
              else:
                  value = value.encode("utf8")
  
              l = len(keyword) + len(value) + 3   # ' ' + '=' + '\n'
              n = p = 0
              while True:
                  n = l + len(str(p))
                  if n == p:
                      break
                  p = n
              records += bytes(str(p), "ascii") + b" " + keyword + b"=" + value + b"\n"
  
          # We use a hardcoded "././@PaxHeader" name like star does
          # instead of the one that POSIX recommends.
          info = {}
          info["name"] = "././@PaxHeader"
          info["type"] = type
          info["size"] = len(records)
          info["magic"] = POSIX_MAGIC
  
          # Create pax header + record blocks.
          return cls._create_header(info, USTAR_FORMAT, "ascii", "replace") + \
                  cls._create_payload(records)
docs: Return a POSIX.1-2008 extended or global header sequence
             that contains a list of keyword, value pairs. The values
             must be strings.