0,0 → 1,304 |
<?php |
/* $Id: charset_conversion.lib.php,v 2.9 2006/01/17 17:02:30 cybot_tm Exp $ */ |
// vim: expandtab sw=4 ts=4 sts=4: |
|
|
/** |
* Charset conversion functions. |
*/ |
|
|
/** |
* Loads the recode or iconv extensions if any of it is not loaded yet |
*/ |
if (isset($cfg['AllowAnywhereRecoding']) |
&& $cfg['AllowAnywhereRecoding'] |
&& $allow_recoding) { |
|
if ($cfg['RecodingEngine'] == 'recode') { |
if (!@extension_loaded('recode')) { |
PMA_dl('recode'); |
if (!@extension_loaded('recode')) { |
echo $strCantLoadRecodeIconv; |
exit; |
} |
} |
$PMA_recoding_engine = 'recode'; |
} elseif ($cfg['RecodingEngine'] == 'iconv') { |
if (!@extension_loaded('iconv')) { |
PMA_dl('iconv'); |
if (!@extension_loaded('iconv')) { |
echo $strCantLoadRecodeIconv; |
exit; |
} |
} |
$PMA_recoding_engine = 'iconv'; |
} else { |
if (@extension_loaded('iconv')) { |
$PMA_recoding_engine = 'iconv'; |
} elseif (@extension_loaded('recode')) { |
$PMA_recoding_engine = 'recode'; |
} else { |
PMA_dl('iconv'); |
if (!@extension_loaded('iconv')) { |
PMA_dl('recode'); |
if (!@extension_loaded('recode')) { |
echo $strCantLoadRecodeIconv; |
exit; |
} else { |
$PMA_recoding_engine = 'recode'; |
} |
} else { |
$PMA_recoding_engine = 'iconv'; |
} |
} |
} |
} // end load recode/iconv extension |
|
define('PMA_CHARSET_NONE', 0); |
define('PMA_CHARSET_ICONV', 1); |
define('PMA_CHARSET_LIBICONV', 2); |
define('PMA_CHARSET_RECODE', 3); |
|
if (!isset($cfg['IconvExtraParams'])) { |
$cfg['IconvExtraParams'] = ''; |
} |
|
// Finally detects which function will we use: |
if (isset($cfg['AllowAnywhereRecoding']) |
&& $cfg['AllowAnywhereRecoding'] |
&& $allow_recoding) { |
|
if (!isset($PMA_recoding_engine)) { |
$PMA_recoding_engine = $cfg['RecodingEngine']; |
} |
if ($PMA_recoding_engine == 'iconv') { |
if (@function_exists('iconv')) { |
$PMA_recoding_engine = PMA_CHARSET_ICONV; |
} elseif (@function_exists('libiconv')) { |
$PMA_recoding_engine = PMA_CHARSET_LIBICONV; |
} else { |
$PMA_recoding_engine = PMA_CHARSET_NONE; |
|
if (!isset($GLOBALS['is_header_sent'])) { |
include('./libraries/header.inc.php'); |
} |
echo $strCantUseRecodeIconv; |
require_once('./libraries/footer.inc.php'); |
exit(); |
} |
} elseif ($PMA_recoding_engine == 'recode') { |
if (@function_exists('recode_string')) { |
$PMA_recoding_engine = PMA_CHARSET_RECODE; |
} else { |
$PMA_recoding_engine = PMA_CHARSET_NONE; |
|
require_once('./libraries/header.inc.php'); |
echo $strCantUseRecodeIconv; |
require_once('./libraries/footer.inc.php'); |
exit; |
} |
} else { |
if (@function_exists('iconv')) { |
$PMA_recoding_engine = PMA_CHARSET_ICONV; |
} elseif (@function_exists('libiconv')) { |
$PMA_recoding_engine = PMA_CHARSET_LIBICONV; |
} elseif (@function_exists('recode_string')) { |
$PMA_recoding_engine = PMA_CHARSET_RECODE; |
} else { |
$PMA_recoding_engine = PMA_CHARSET_NONE; |
|
require_once('./libraries/header.inc.php'); |
echo $strCantUseRecodeIconv; |
require_once('./libraries/footer.inc.php'); |
exit; |
} |
} |
} else { |
$PMA_recoding_engine = PMA_CHARSET_NONE; |
} |
|
|
/** |
* Converts encoding according to current settings. |
* |
* @param mixed what to convert (string or array of strings or object returned by mysql_fetch_field) |
* |
* @return string converted string or array of strings |
* |
* @global array the configuration array |
* @global boolean whether recoding is allowed or not |
* @global string the current charset |
* @global array the charset to convert to |
* |
* @access public |
* |
* @author nijel |
*/ |
function PMA_convert_display_charset($what) { |
global $cfg, $allow_recoding, $charset, $convcharset; |
|
if (!(isset($cfg['AllowAnywhereRecoding']) && $cfg['AllowAnywhereRecoding'] && $allow_recoding) |
|| $convcharset == $charset // rabus: if input and output charset are the same, we don't have to do anything... |
// this constant is not defined before the login: |
|| (defined('PMA_MYSQL_INT_VERSION') && PMA_MYSQL_INT_VERSION >= 40100) ) { // lem9: even if AllowAnywhereRecoding is TRUE, do not recode for MySQL >= 4.1.x since MySQL does the job |
return $what; |
} elseif (is_array($what)) { |
$result = array(); |
foreach ($what AS $key => $val) { |
if (is_string($val) || is_array($val)) { |
if (is_string($key)) { |
$result[PMA_convert_display_charset($key)] = PMA_convert_display_charset($val); |
} else { |
$result[$key] = PMA_convert_display_charset($val); |
} |
} else { |
$result[$key] = $val; |
} |
} // end while |
return $result; |
} elseif (is_string($what)) { |
|
switch ($GLOBALS['PMA_recoding_engine']) { |
case PMA_CHARSET_RECODE: |
return recode_string($convcharset . '..' . $charset, $what); |
case PMA_CHARSET_ICONV: |
return iconv($convcharset, $charset . $cfg['IconvExtraParams'], $what); |
case PMA_CHARSET_LIBICONV: |
return libiconv($convcharset, $charset, $what); |
default: |
return $what; |
} |
} elseif (is_object($what)) { |
// isn't it object returned from mysql_fetch_field ? |
if (@is_string($what->name)) { |
$what->name = PMA_convert_display_charset($what->name); |
} |
if (@is_string($what->table)) { |
$what->table = PMA_convert_display_charset($what->table); |
} |
if (@is_string($what->Database)) { |
$what->Database = PMA_convert_display_charset($what->Database); |
} |
return $what; |
} else { |
// when we don't know what it is we don't touch it... |
return $what; |
} |
} // end of the "PMA_convert_display_charset()" function |
|
|
/** |
* Converts encoding of text according to current settings. |
* |
* @param string what to convert |
* |
* @return string converted text |
* |
* @global array the configuration array |
* @global boolean whether recoding is allowed or not |
* @global string the current charset |
* @global array the charset to convert to |
* |
* @access public |
* |
* @author nijel |
*/ |
function PMA_convert_charset($what) { |
global $cfg, $allow_recoding, $charset, $convcharset; |
|
if (!(isset($cfg['AllowAnywhereRecoding']) && $cfg['AllowAnywhereRecoding'] && $allow_recoding) |
|| $convcharset == $charset) { // rabus: if input and output charset are the same, we don't have to do anything... |
return $what; |
} else { |
switch ($GLOBALS['PMA_recoding_engine']) { |
case PMA_CHARSET_RECODE: |
return recode_string($charset . '..' . $convcharset, $what); |
case PMA_CHARSET_ICONV: |
return iconv($charset, $convcharset . $cfg['IconvExtraParams'], $what); |
case PMA_CHARSET_LIBICONV: |
return libiconv($charset, $convcharset, $what); |
default: |
return $what; |
} |
} |
} // end of the "PMA_convert_charset()" function |
|
/** |
* Converts encoding of text according to parameters with detected |
* conversion function. |
* |
* @param string source charset |
* @param string target charset |
* @param string what to convert |
* |
* @return string converted text |
* |
* @access public |
* |
* @author nijel |
*/ |
function PMA_convert_string($src_charset, $dest_charset, $what) { |
if ($src_charset == $dest_charset) { |
return $what; |
} |
switch ($GLOBALS['PMA_recoding_engine']) { |
case PMA_CHARSET_RECODE: |
return recode_string($src_charset . '..' . $dest_charset, $what); |
case PMA_CHARSET_ICONV: |
return iconv($src_charset, $dest_charset . $GLOBALS['cfg']['IconvExtraParams'], $what); |
case PMA_CHARSET_LIBICONV: |
return libiconv($src_charset, $dest_charset, $what); |
default: |
return $what; |
} |
} // end of the "PMA_convert_string()" function |
|
|
/** |
* Converts encoding of file according to parameters with detected |
* conversion function. The old file will be unlinked and new created and |
* its file name is returned. |
* |
* @param string source charset |
* @param string target charset |
* @param string file to convert |
* |
* @return string new temporay file |
* |
* @access public |
* |
* @author nijel |
*/ |
function PMA_convert_file($src_charset, $dest_charset, $file) { |
switch ($GLOBALS['PMA_recoding_engine']) { |
case PMA_CHARSET_RECODE: |
case PMA_CHARSET_ICONV: |
case PMA_CHARSET_LIBICONV: |
$tmpfname = tempnam('', 'PMA_convert_file'); |
$fin = fopen($file, 'r'); |
$fout = fopen($tmpfname, 'w'); |
if ($GLOBALS['PMA_recoding_engine'] == PMA_CHARSET_RECODE) { |
recode_file($src_charset . '..' . $dest_charset, $fin, $fout); |
} else { |
while (!feof($fin)) { |
$line = fgets($fin, 4096); |
if ($GLOBALS['PMA_recoding_engine'] == PMA_CHARSET_ICONV) { |
$dist = iconv($src_charset, $dest_charset . $GLOBALS['cfg']['IconvExtraParams'], $line); |
} else { |
$dist = libiconv($src_charset, $dest_charset, $line); |
} |
fputs($fout, $dist); |
} // end while |
} |
fclose($fin); |
fclose($fout); |
unlink($file); |
|
return $tmpfname; |
default: |
return $file; |
} |
} // end of the "PMA_convert_file()" function |
|
?> |