diff --git a/main/inc/lib/multibyte_string_functions.lib.php b/main/inc/lib/multibyte_string_functions.lib.php index 75d7a3e85f..67613f55ba 100644 --- a/main/inc/lib/multibyte_string_functions.lib.php +++ b/main/inc/lib/multibyte_string_functions.lib.php @@ -410,29 +410,37 @@ function api_str_ireplace($search, $replace, $subject, & $count = null, $encodin * @link http://php.net/str_split */ function api_str_split($string, $split_length = 1, $encoding = null) { - if ($split_length < 1) { - return false; - } if (empty($encoding)) { $encoding = api_mb_internal_encoding(); } + if (empty($string)) { + return array(); + } + if ($split_length < 1) { + return false; + } if (_api_is_single_byte_encoding($encoding)) { return str_split($string, $split_length); } - $result = array(); - if (api_mb_supports($encoding)) { - for ($i = 0, $length = @mb_strlen($string, $encoding); $i < $length; $i += $split_length) { - $result[] = @mb_substr($string, $i, $split_length, $encoding); + if (api_is_encoding_supported($encoding)) { + $len = api_strlen($string); + if ($len <= $split_length) { + return array($string); } - } - elseif (api_is_encoding_supported($encoding)) { - for ($i = 0, $length = api_strlen($string, $encoding); $i < $length; $i += $split_length) { - $result[] = api_substr($string, $i, $split_length, $encoding); + if (!api_is_utf8($encoding)) { + $string = api_utf8_encode($string, $encoding); } - } else { - return str_split($string, $split_length); + if (preg_match_all('/.{'.$split_length.'}|[^\x00]{1,'.$split_length.'}$/us', $string, $result) === false) { + return array(); + } + if (!api_is_utf8($encoding)) { + global $_api_encoding; + $_api_encoding = $encoding; + $result = _api_array_utf8_decode($result[0]); + } + return $result[0]; } - return $result; + return str_split($string, $split_length); } /** @@ -456,22 +464,22 @@ function api_stripos($haystack, $needle, $offset = 0, $encoding = null) { } elseif (api_is_encoding_supported($encoding)) { if (MBSTRING_INSTALLED) { - return api_utf8_decode(@mb_stripos(api_utf8_encode($haystack, $encoding), api_utf8_encode($needle, $encoding), $offset, 'UTF-8'), $encoding); - } else { - return api_strpos(api_strtolower($haystack, $encoding), api_strtolower($needle, $encoding), $offset, $encoding); + return @mb_stripos(api_utf8_encode($haystack, $encoding), api_utf8_encode($needle, $encoding), $offset, 'UTF-8'); } + return api_strpos(api_strtolower($haystack, $encoding), api_strtolower($needle, $encoding), $offset, $encoding); } return stripos($haystack, $needle, $offset); } /** * Finds first occurrence of a string within another, case insensitive. - * @param string $haystack The string from which to get the first occurrence. - * @param string @needle The string to be found. + * @param string $haystack The string from which to get the first occurrence. + * @param mixed $needle The string to be found. * @param bool $before_needle (optional) Determines which portion of $haystack this function returns. The default value is FALSE. - * @param string $encoding (optional) The used internally by this function character encoding. If it is omitted, the platform character set will be used by default. - * @return mixed Returns the portion of $haystack, or FALSE if $needle is not found. + * @param string $encoding (optional) The used internally by this function character encoding. If it is omitted, the platform character set will be used by default. + * @return mixed Returns the portion of $haystack, or FALSE if $needle is not found. * Notes: + * If $needle is not a string, it is converted to an integer and applied as the ordinal value (codepoint if the encoding is UTF-8) of a character. * If $before_needle is set to TRUE, the function returns all of $haystack from the beginning to the first occurrence of $needle. * If $before_needle is set to FALSE, the function returns all of $haystack from the first occurrence of $needle to the end. * This function is aimed at replacing the functions stristr() and mb_stristr() for human-language strings. @@ -482,13 +490,25 @@ function api_stristr($haystack, $needle, $before_needle = false, $encoding = nul if (empty($encoding)) { $encoding = api_mb_internal_encoding(); } + if (!is_string($needle)) { + $needle = (int)$needle; + if (api_is_utf8($encoding)) { + $needle = _api_utf8_chr($needle); + } else { + $needle = chr($needle); + } + } if (api_mb_supports($encoding)) { return @mb_stristr($haystack, $needle, $before_needle, $encoding); } - elseif (MBSTRING_INSTALLED && api_is_encoding_supported($encoding)) { - return api_utf8_decode(@mb_stristr(api_utf8_encode($haystack, $encoding), api_utf8_encode($needle, $encoding), $before_needle, 'UTF-8')); - } elseif (api_is_encoding_supported($encoding)) { + if (MBSTRING_INSTALLED) { + $result = @mb_stristr(api_utf8_encode($haystack, $encoding), api_utf8_encode($needle, $encoding), $before_needle, 'UTF-8'); + if ($result === false) { + return false; + } + return api_utf8_decode($result, $encoding); + } $result = api_strstr(api_strtolower($haystack, $encoding), api_strtolower($needle, $encoding), $before_needle, $encoding); if ($result === false) { return false; @@ -559,10 +579,10 @@ function api_strpos($haystack, $needle, $offset = 0, $encoding = null) { elseif (api_mb_supports($encoding)) { return @mb_strpos($haystack, $needle, $offset, $encoding); } - elseif (MBSTRING_INSTALLED && (api_iconv_supports($encoding) || _api_convert_encoding_supports($encoding))) { - return api_utf8_decode(@mb_strpos(api_utf8_encode($haystack, $encoding), api_utf8_encode($needle, $encoding), $offset, 'UTF-8'), $encoding); - } - elseif (api_iconv_supports($encoding) || _api_convert_encoding_supports($encoding)) { + elseif (api_is_encoding_supported($encoding)) { + if (MBSTRING_INSTALLED) { + return @mb_strpos(api_utf8_encode($haystack, $encoding), api_utf8_encode($needle, $encoding), $offset, 'UTF-8'); + } if (!api_is_utf8($encoding)) { $haystack = api_utf8_encode($haystack, $encoding); $needle = api_utf8_encode($needle, $encoding); @@ -573,25 +593,25 @@ function api_strpos($haystack, $needle, $offset = 0, $encoding = null) { return api_strlen($haystack[0]); } return false; - } else { - $haystack = api_substr($haystack, $offset); - if (($pos = api_strpos($haystack, $needle)) !== false ) { - return $pos + $offset; - } - return false; } + $haystack = api_substr($haystack, $offset); + if (($pos = api_strpos($haystack, $needle)) !== false ) { + return $pos + $offset; + } + return false; } return strpos($haystack, $needle, $offset); } /** * Finds the last occurrence of a character in a string. - * @param string $haystack The string from which to get the last occurrence. - * @param string $needle The string which first character is to be found. + * @param string $haystack The string from which to get the last occurrence. + * @param mixed $needle The string which first character is to be found. * @param bool $before_needle (optional) Determines which portion of $haystack this function returns. The default value is FALSE. - * @param string $encoding (optional) The used internally by this function character encoding. If it is omitted, the platform character set will be used by default. - * @return mixed Returns the portion of $haystack, or FALSE if the first character from $needle is not found. + * @param string $encoding (optional) The used internally by this function character encoding. If it is omitted, the platform character set will be used by default. + * @return mixed Returns the portion of $haystack, or FALSE if the first character from $needle is not found. * Notes: + * If $needle is not a string, it is converted to an integer and applied as the ordinal value (codepoint if the encoding is UTF-8) of a character. * If $before_needle is set to TRUE, the function returns all of $haystack from the beginning to the first occurrence. * If $before_needle is set to FALSE, the function returns all of $haystack from the first occurrence to the end. * This function is aimed at replacing the functions strrchr() and mb_strrchr() for human-language strings. @@ -602,16 +622,42 @@ function api_strrchr($haystack, $needle, $before_needle = false, $encoding = nul if (empty($encoding)) { $encoding = api_mb_internal_encoding(); } + if (!is_string($needle)) { + $needle = (int)$needle; + if (api_is_utf8($encoding)) { + $needle = _api_utf8_chr($needle); + } else { + $needle = chr($needle); + } + } if (_api_is_single_byte_encoding($encoding)) { - return strrchr($haystack, $needle); + if (!$before_needle) { + return strrchr($haystack, $needle); + } + $result = strrchr($haystack, $needle); + if ($result === false) { + return false; + } + return api_substr($haystack, 0, api_strlen($haystack, $encoding) - api_strlen($result, $encoding), $encoding); } elseif (api_mb_supports($encoding)) { return @mb_strrchr($haystack, $needle, $before_needle, $encoding); } - elseif (MBSTRING_INSTALLED && (api_iconv_supports($encoding) || _api_convert_encoding_supports($encoding))) { - return api_utf8_decode(@mb_strrchr(api_utf8_encode($haystack, $encoding), api_utf8_encode($needle, $encoding), $before_needle, 'UTF-8'), $encoding); + elseif (MBSTRING_INSTALLED && api_is_encoding_supported($encoding)) { + $result = @mb_strrchr(api_utf8_encode($haystack, $encoding), api_utf8_encode($needle, $encoding), $before_needle, 'UTF-8'); + if ($result === false) { + return false; + } + return api_utf8_decode($result, $encoding); + } + if (!$before_needle) { + return strrchr($haystack, $needle); + } + $result = strrchr($haystack, $needle); + if ($result === false) { + return false; } - return strrchr($haystack, $needle); + return api_substr($haystack, 0, api_strlen($haystack, $encoding) - api_strlen($result, $encoding), $encoding); } /** @@ -623,17 +669,19 @@ function api_strrchr($haystack, $needle, $before_needle = false, $encoding = nul * @link http://php.net/manual/en/function.strrev */ function api_strrev($string, $encoding = null) { + if (empty($encoding)) { + $encoding = api_mb_internal_encoding(); + } if (empty($string)) { return ''; } - if (empty($encoding)) { - $encoding = api_mb_internal_encoding(); + if (_api_is_single_byte_encoding($encoding)) { + return strrev($string); } - $result = ''; - for ($i = api_strlen($string, $encoding) - 1; $i > -1; $i--) { - $result .= api_substr($string, $i, 1, $encoding); + if (api_is_encoding_supported($encoding)) { + return implode(array_reverse(api_str_split($string, 1, $encoding))); } - return $result; + return strrev($string); } /** @@ -652,23 +700,62 @@ function api_strrpos($haystack, $needle, $offset = 0, $encoding = null) { if (empty($encoding)) { $encoding = api_mb_internal_encoding(); } + if (_api_is_single_byte_encoding($encoding)) { + return strrpos($haystack, $needle, $offset); + } if (api_mb_supports($encoding)) { return @mb_strrpos($haystack, $needle, $offset, $encoding); } - elseif (MBSTRING_INSTALLED && api_iconv_supports($encoding)) { - return api_utf8_decode(@mb_strrpos(api_utf8_encode($haystack, $encoding), api_utf8_encode($needle, $encoding), $offset, 'UTF-8'), $encoding); + elseif (api_is_encoding_supported($encoding)) { + if (MBSTRING_INSTALLED) { + return @mb_strrpos(api_utf8_encode($haystack, $encoding), api_utf8_encode($needle, $encoding), $offset, 'UTF-8'); + } + // This branch (this fragment of code) is an adaptation from the CakePHP(tm) Project, http://www.cakefoundation.org + if (!api_is_utf8($encoding)) { + $haystack = api_utf8_encode($haystack, $encoding); + $needle = api_utf8_encode($needle, $encoding); + } + $found = false; + $haystack = _api_utf8_to_unicode($haystack); + $haystack_count = count($haystack); + $matches = array_count_values($haystack); + $needle = _api_utf8_to_unicode($needle); + $needle_count = count($needle); + $position = $offset; + while (($found === false) && ($position < $haystack_count)) { + if (isset($needle[0]) && $needle[0] === $haystack[$position]) { + for ($i = 1; $i < $needle_count; $i++) { + if ($needle[$i] !== $haystack[$position + $i]) { + if ($needle[$i] === $haystack[($position + $i) -1]) { + $position--; + $found = true; + continue; + } + } + } + if (!$offset && isset($matches[$needle[0]]) && $matches[$needle[0]] > 1) { + $matches[$needle[0]] = $matches[$needle[0]] - 1; + } elseif ($i === $needle_count) { + $found = true; + $position--; + } + } + $position++; + } + return ($found) ? $position : false; } return strrpos($haystack, $needle, $offset); } /** * Finds first occurrence of a string within another. - * @param string $haystack The string from which to get the first occurrence. - * @param string @needle The string to be found. + * @param string $haystack The string from which to get the first occurrence. + * @param mixed $needle The string to be found. * @param bool $before_needle (optional) Determines which portion of $haystack this function returns. The default value is FALSE. - * @param string $encoding (optional) The used internally by this function character encoding. If it is omitted, the platform character set will be used by default. - * @return mixed Returns the portion of $haystack, or FALSE if $needle is not found. + * @param string $encoding (optional) The used internally by this function character encoding. If it is omitted, the platform character set will be used by default. + * @return mixed Returns the portion of $haystack, or FALSE if $needle is not found. * Notes: + * If $needle is not a string, it is converted to an integer and applied as the ordinal value (codepoint if the encoding is UTF-8) of a character. * If $before_needle is set to TRUE, the function returns all of $haystack from the beginning to the first occurrence of $needle. * If $before_needle is set to FALSE, the function returns all of $haystack from the first occurrence of $needle to the end. * This function is aimed at replacing the functions strstr() and mb_strstr() for human-language strings. @@ -742,14 +829,14 @@ function api_strtolower($string, $encoding = null) { if (api_mb_supports($encoding)) { return @mb_strtolower($string, $encoding); } - elseif (MBSTRING_INSTALLED && api_iconv_supports($encoding)) { - return api_utf8_decode(@mb_strtolower(api_utf8_encode($string, $encoding), 'UTF-8'), $encoding); - } - elseif (api_iconv_supports($encoding) || _api_convert_encoding_supports($encoding)) { + elseif (api_is_encoding_supported($encoding)) { + if (MBSTRING_INSTALLED) { + return api_utf8_decode(@mb_strtolower(api_utf8_encode($string, $encoding), 'UTF-8'), $encoding); + } + // This branch (this fragment of code) is an adaptation from the CakePHP(tm) Project, http://www.cakefoundation.org if (!api_is_utf8($encoding)) { $string = api_utf8_encode($string, $encoding); } - // This branch (this fragment of code) is an adaptation from the CakePHP(tm) Project, http://www.cakefoundation.org $codepoints = _api_utf8_to_unicode($string); $length = count($codepoints); $matched = false; @@ -806,14 +893,14 @@ function api_strtoupper($string, $encoding = null) { if (api_mb_supports($encoding)) { return @mb_strtoupper($string, $encoding); } - elseif (MBSTRING_INSTALLED && api_iconv_supports($encoding)) { - return api_utf8_decode(@mb_strtoupper(api_utf8_encode($string, $encoding), 'UTF-8'), $encoding); - } - elseif (api_iconv_supports($encoding) || _api_convert_encoding_supports($encoding)) { + elseif (api_is_encoding_supported($encoding)) { + if (MBSTRING_INSTALLED) { + return api_utf8_decode(@mb_strtoupper(api_utf8_encode($string, $encoding), 'UTF-8'), $encoding); + } + // This branch (this fragment of code) is an adaptation from the CakePHP(tm) Project, http://www.cakefoundation.org if (!api_is_utf8($encoding)) { $string = api_utf8_encode($string, $encoding); } - // This branch (this fragment of code) is an adaptation from the CakePHP(tm) Project, http://www.cakefoundation.org $codepoints = _api_utf8_to_unicode($string); $length = count($codepoints); $matched = false; @@ -966,14 +1053,20 @@ function api_substr($string, $start, $length = null, $encoding = null) { if (is_null($length)) { $length = api_strlen($string, $encoding); } + if (_api_is_single_byte_encoding($encoding)) { + return substr($string, $start, $length); + } if (api_mb_supports($encoding)) { return @mb_substr($string, $start, $length, $encoding); } - elseif (MBSTRING_INSTALLED && api_iconv_supports($encoding)) { - return api_utf8_decode(@mb_substr(api_utf8_encode($string, $encoding), $start, $length, 'UTF-8'), $encoding); - } - elseif (api_is_utf8($encoding)) { + elseif (api_is_encoding_supported($encoding)) { + if (MBSTRING_INSTALLED) { + return api_utf8_decode(@mb_substr(api_utf8_encode($string, $encoding), $start, $length, 'UTF-8'), $encoding); + } // The following branch of code is from the Drupal CMS, see the function drupal_substr(). + if (!api_is_utf8($encoding)) { + $string = api_utf8_encode($string, $encoding); + } $strlen = api_byte_count($string); // Find the starting byte offset $bytes = 0; @@ -1034,7 +1127,11 @@ function api_substr($string, $start, $length = null, $encoding = null) { } } $iend = $bytes; - return substr($string, $istart, max(0, $iend - $istart + 1)); + $string = substr($string, $istart, max(0, $iend - $istart + 1)); + if (!api_is_utf8($encoding)) { + $string = api_utf8_decode($string, $encoding); + } + return $string; } return substr($string, $start, $length); } @@ -1062,16 +1159,29 @@ function api_substr_replace($string, $replacement, $start, $length = null, $enco if (empty($encoding)) { $encoding = api_mb_internal_encoding(); } - if ($length == null) { - return api_substr($string, 0, $start, $encoding) . $replacement; - } else { + if (api_is_encoding_supported($encoding) && !_api_is_single_byte_encoding($encoding)) { + $string_length = api_strlen($string, $encoding); + if ($start < 0) { + $start = max(0, $string_length + $start); + } + else if ($start > $string_length) { + $start = $string_length; + } if ($length < 0) { - $length = api_strlen($string, $encoding) - $start + $length; + $length = max(0, $string_length - $start + $length); } - return - api_substr($string, 0, $start, $encoding) . $replacement . - api_substr($string, $start + $length, api_strlen($string, $encoding), $encoding); + else if (is_null($length) || ($length > $string_length)) { + $length = $string_length; + } + if (($start + $length) > $string_length) { + $length = $string_length - $start; + } + return api_substr($string, 0, $start, $encoding) . $replacement . api_substr($string, $start + $length, $string_length - $start - $length, $encoding); + } + if (is_null($length)) { + return substr_replace($string, $replacement, $start); } + return substr_replace($string, $replacement, $start, $length); } /** @@ -1140,12 +1250,14 @@ function api_ereg($pattern, $string, & $regs = null) { } } elseif (MBSTRING_INSTALLED && api_iconv_supports($encoding)) { + global $_api_encoding; + $_api_encoding = $encoding; api_mb_regex_encoding('UTF-8'); if ($count < 3) { $result = @mb_ereg(api_utf8_encode($pattern, $encoding), api_utf8_encode($string, $encoding)); } else { $result = @mb_ereg(api_utf8_encode($pattern, $encoding), api_utf8_encode($string, $encoding), $regs); - $regs = _api_array_utf8_decode($regs, $encoding); + $regs = _api_array_utf8_decode($regs); } api_mb_regex_encoding($encoding); return $result; @@ -1221,13 +1333,14 @@ function api_eregi($pattern, $string, & $regs = null) { } } elseif (MBSTRING_INSTALLED && api_iconv_supports($encoding)) { + global $_api_encoding; + $_api_encoding = $encoding; api_mb_regex_encoding('UTF-8'); - if ($count < 3) { $result = @mb_eregi(api_utf8_encode($pattern, $encoding), api_utf8_encode($string, $encoding)); } else { $result = @mb_eregi(api_utf8_encode($pattern, $encoding), api_utf8_encode($string, $encoding), $regs); - $regs = _api_array_utf8_decode($regs, $encoding); + $regs = _api_array_utf8_decode($regs); } api_mb_regex_encoding($encoding); return $result; @@ -1416,13 +1529,15 @@ function api_split($pattern, $string, $limit = null) { } } elseif (MBSTRING_INSTALLED && api_iconv_supports($encoding)) { + global $_api_encoding; + $_api_encoding = $encoding; api_mb_regex_encoding('UTF-8'); if (is_null($limit)) { $result = @mb_split(api_utf8_encode($pattern, $encoding), api_utf8_encode($string, $encoding)); } else { $result = @mb_split(api_utf8_encode($pattern, $encoding), api_utf8_encode($string, $encoding), $limit); } - $result = _api_array_utf8_decode($result, $encoding); + $result = _api_array_utf8_decode($result); api_mb_regex_encoding($encoding); return $result; } else { @@ -2243,24 +2358,34 @@ yoruba: ISO-8859-15, WINDOWS-1252, ISO-8859-1; /** * This function unifies the encoding identificators, so they could be compared. - * @param string $encoding The specified encoding. - * @return string Returns the encoding identificator modified in suitable for comparison way. + * @param string/array $encoding The specified encoding. + * @return string Returns the encoding identificator modified in suitable for comparison way. */ function api_refine_encoding_id($encoding) { + if (is_array($encoding)){ + return array_map('strtoupper', $encoding); + } return strtoupper($encoding); } /** * This function checks whether two $encoding are equal (same, equvalent). - * @param string $encoding1 The first encoding - * @param string $encoding2 The second encoding - * @return bool Returns TRUE if the encodings are equal, FALSE otherwise. + * @param string/array $encoding1 The first encoding + * @param string/array $encoding2 The second encoding + * @return bool Returns TRUE if the encodings are equal, FALSE otherwise. */ function api_equal_encodings($encoding1, $encoding2) { - // We have to deal with aliases. This function alone does not solve - // the problem entirely. And there is no time for this kind of research. - // At the momemnt, the quick proposition could be: - return strcmp(api_refine_encoding_id($encoding1), api_refine_encoding_id($encoding2)) == 0 ? true : false; + $is_array_encoding1 = is_array($encoding1); + $is_array_encoding2 = is_array($encoding2); + $encoding1 = api_refine_encoding_id($encoding1); + $encoding2 = api_refine_encoding_id($encoding2); + if (!$is_array_encoding1 && !$is_array_encoding2) { + return $encoding1 == $encoding2; + } + if ($is_array_encoding2) { + return in_array($encoding1, $encoding2); + } + return in_array($encoding2, $encoding1); } /** @@ -2271,27 +2396,33 @@ function api_equal_encodings($encoding1, $encoding2) { function api_is_utf8($encoding) { static $result = array(); if (!isset($result[$encoding])) { - $result[$encoding] = api_equal_encodings($encoding, 'UTF-8'); + $result[$encoding] = api_equal_encodings($encoding, array('UTF-8', 'CP65001', 'WINDOWS-65001')); } return $result[$encoding]; } /** * This function checks whether a given encoding represents (is an alias of) ISO Latin 1 character set. - * @param string $encoding The tested encoding. - * @return bool Returns TRUE if the given encoding id means Latin 1 character set, otherwise returns false. + * @param string/array $encoding The tested encoding. + * @return bool Returns TRUE if the given encoding id means Latin 1 character set, otherwise returns false. */ function api_is_latin1($encoding, $strict = false) { - static $latin1_encodings = array('ISO-8859-1', 'ISO8859-1', 'CP819', 'LATIN1'); - static $latin1_encodings_like = array( - 'ISO-8859-1', 'ISO8859-1', 'CP819', 'LATIN1', - 'ISO-8859-15', 'ISO8859-15', 'CP923', 'LATIN0', 'LATIN-9', - 'WINDOWS-1252', 'CP1252', 'WIN-1252', 'WIN1252' - ); + static $latin1 = array(); + static $latin1_strict = array(); if ($strict) { - return in_array(api_refine_encoding_id($encoding), $latin1_encodings); + if (!isset($latin1_strict[$encoding])) { + $latin1_strict[$encoding] = api_equal_encodings($encoding, array('ISO-8859-1', 'ISO8859-1', 'CP819', 'LATIN1')); + } + return $latin1_strict[$encoding]; + } + if (!isset($latin1[$encoding])) { + $latin1[$encoding] = api_equal_encodings($encoding, array( + 'ISO-8859-1', 'ISO8859-1', 'CP819', 'LATIN1', + 'ISO-8859-15', 'ISO8859-15', 'CP923', 'LATIN0', 'LATIN-9', + 'WINDOWS-1252', 'CP1252', 'WIN-1252', 'WIN1252' + )); } - return in_array(api_refine_encoding_id($encoding), $latin1_encodings_like); + return $latin1[$encoding]; } /** diff --git a/main/inc/lib/multibyte_string_functions_internal.lib.php b/main/inc/lib/multibyte_string_functions_internal.lib.php index f125b39c0b..aaa420db25 100644 --- a/main/inc/lib/multibyte_string_functions_internal.lib.php +++ b/main/inc/lib/multibyte_string_functions_internal.lib.php @@ -10,6 +10,10 @@ * ============================================================================== */ +// Global variables used by some callback functions. +$_api_encoding = null; +$_api_collator = null; + /** * ---------------------------------------------------------------------------- @@ -400,12 +404,13 @@ function _api_utf8_get_letter_case_properties($codepoint, $type = 'lower') { // This (callback) function convers from UTF-8 to other encoding. // It works with arrays of strings too. -function _api_array_utf8_decode($variable, $encoding) { +function _api_array_utf8_decode($variable) { + global $_api_encoding; if (is_array($variable)) { - return array_map('_api_array_utf8_decode', $variable, $encoding); + return array_map('_api_array_utf8_decode', $variable); } if (is_string($var)) { - return api_utf8_decode($variable, $encoding); + return api_utf8_decode($variable, $_api_encoding); } return $variable; } @@ -445,10 +450,6 @@ function _api_get_alpha_numerical_collator($language = null) { return $collator[$language]; } -// Global variables used by the sorting functions. -$_api_collator = null; -$_api_encoding = null; - // A string comparison function that serves sorting functions. function _api_cmp($string1, $string2) { global $_api_collator, $_api_encoding;