static function iconv($in_charset, $out_charset, $str) { if ('' === (string) $str) { return ''; } // Prepare for //IGNORE and //TRANSLIT $TRANSLIT = $IGNORE = ''; $out_charset = strtolower($out_charset); $in_charset = strtolower($in_charset); '' === $out_charset && ($out_charset = 'iso-8859-1'); '' === $in_charset && ($in_charset = 'iso-8859-1'); if ('//translit' === substr($out_charset, -10)) { $TRANSLIT = '//TRANSLIT'; $out_charset = substr($out_charset, 0, -10); } if ('//ignore' === substr($out_charset, -8)) { $IGNORE = '//IGNORE'; $out_charset = substr($out_charset, 0, -8); } '//translit' === substr($in_charset, -10) && ($in_charset = substr($in_charset, 0, -10)); '//ignore' === substr($in_charset, -8) && ($in_charset = substr($in_charset, 0, -8)); isset(self::$alias[$in_charset]) && ($in_charset = self::$alias[$in_charset]); isset(self::$alias[$out_charset]) && ($out_charset = self::$alias[$out_charset]); // Load charset maps if ('utf-8' !== $in_charset && !self::loadMap('from.', $in_charset, $in_map) || 'utf-8' !== $out_charset && !self::loadMap('to.', $out_charset, $out_map)) { user_error(sprintf(self::ERROR_WRONG_CHARSET, $in_charset, $out_charset)); return false; } if ('utf-8' !== $in_charset) { // Convert input to UTF-8 $result = ''; if (self::map_to_utf8($result, $in_map, $str, $IGNORE)) { $str = $result; } else { $str = false; } self::$is_valid_utf8 = true; } else { self::$is_valid_utf8 = preg_match('//u', $str); if (!self::$is_valid_utf8 && !$IGNORE) { user_error(self::ERROR_ILLEGAL_CHARACTER); return false; } if ('utf-8' === $out_charset) { // UTF-8 validation $str = self::utf8_to_utf8($str, $IGNORE); } } if ('utf-8' !== $out_charset && false !== $str) { // Convert output to UTF-8 $result = ''; if (self::map_from_utf8($result, $out_map, $str, $IGNORE, $TRANSLIT)) { return $result; } else { return false; } } else { return $str; } }