	private function normalize($str, $opts) {
		if ($opts['nfc'] || $opts['nfkc']) {
			if (class_exists('Normalizer', false)) {
				if ($opts['nfc'] && ! Normalizer::isNormalized($str, Normalizer::FORM_C))
					$str = Normalizer::normalize($str, Normalizer::FORM_C);
				if ($opts['nfkc'] && ! Normalizer::isNormalized($str, Normalizer::FORM_KC))
					$str = Normalizer::normalize($str, Normalizer::FORM_KC);
			} else {
				if (! class_exists('I18N_UnicodeNormalizer', false)) {
					@ include_once 'I18N/UnicodeNormalizer.php';
				}
				if (class_exists('I18N_UnicodeNormalizer', false)) {
					$normalizer = new I18N_UnicodeNormalizer();
					if ($opts['nfc'])
						$str = $normalizer->normalize($str, 'NFC');
					if ($opts['nfkc'])
						$str = $normalizer->normalize($str, 'NFKC');
				}
			}
		}
		if ($opts['lowercase']) {
			$str = strtolower($str);
		}
		if ($opts['convmap'] && is_array($opts['convmap'])) {
			$str = strtr($str, $opts['convmap']);
		}
		return $str;
	}
The software constructs all or part of an SQL command using externally-influenced input from an upstream component, but it does not neutralize or incorrectly neutralizes special elements that could modify the intended SQL command when it is sent to a downstream component.