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])