docs: def evaluate_strings(self, groups):
          """Evaluate strings."""
  
          if self.strings:
              encoding = self.current_encoding
              if self.generic_mode:
                  # Generic assumes no escapes rules.
                  self.quoted_strings.append([groups['strings'][1:-1], self.line_num, encoding])
              else:
                  value = groups['strings']
                  stype = set()
                  if value.endswith('"'):
                      stype = self.get_string_type(value[:value.index('"')].lower().replace('8', ''))
                  if not self.match_string(stype) or value.endswith("'"):
                      return
                  if 'r' in stype:
                      # Handle raw strings. We can handle even if decoding is disabled.
                      olen = len(groups.get('raw')) + len(groups.get('delim')) + 2
                      clen = len(groups.get('delim')) + 2
                      value = self.norm_nl(value[olen:-clen].replace('\x00', '\n'))
                  elif (
                      self.decode_escapes and not value.startswith(('\'', '"')) and
                      'l' not in stype
                  ):
                      # Decode Unicode string. May have added unsupported chars, so use `UTF-8`.
                      value, encoding = self.evaluate_unicode(value)
                  elif self.decode_escapes:
                      # Decode normal strings.
                      value, encoding = self.evaluate_normal(value)
                  else:
                      # Don't decode and just return string content.
                      value = self.norm_nl(value[value.index('"') + 1:-1]).replace('\x00', '\n')
  
                  if value:
                      self.quoted_strings.append([value, self.line_num, encoding])