Функция копирования () PHP, установить кодировку? - PullRequest
0 голосов
/ 28 ноября 2011

Я использую gettext в PHP, и из-за кэширования файлов .mo у меня есть небольшой скрипт, который копирует исходный файл .mo и добавляет к нему время, чтобы он перезагружался. Проблема в том, что использование функции copy() может испортить код файла?

Поскольку у меня есть перевод на датский язык, в UTF-8 поддерживаются датские символы - исходный файл работает под управлением UTF-8, но после его копирования он по какой-то причине не работает.

 <?php
//Starting a session, to store the choosen langauge
session_start();

if (isset($_GET['lang']))
{
    //If the $_GET langauge is set, set the $locale to the get request.
    $locale = $_GET["lang"];
}
else if (isset($_SESSION["lang"]))
{
    //else if the session['lang'] is set, then set the $locale to that session
    $locale = $_SESSION["lang"];
}
else
{
    //Else default is english
    $locale = "en_US";
}

$_SESSION["lang"] = $locale;

$locales_root = "Locale";  // locales directory
$domain = "messages"; // the domain you're using, this is the .PO/.MO file name without the extension

// activate the locale setting
setlocale(LC_ALL, $locale);
setlocale(LC_TIME, $locale);
putenv("LANG=$locale");
// path to the .MO file that we should monitor
$filename = "$locales_root/$locale/LC_MESSAGES/$domain.mo";
$mtime = date('d.H.i.s', strtotime(filemtime($filename))); // check its modification time
// our new unique .MO file
$filename_new = "$locales_root/$locale/LC_MESSAGES/{$domain}_{$mtime}.mo"; 

if (!file_exists($filename_new)) {  // check if we have created it before
      // if not, create it now, by copying the original
      copy($filename,$filename_new);
}
// compute the new domain name
$domain_new = "{$domain}_{$mtime}";
// bind it
bindtextdomain($domain_new,$locales_root);
// then activate it
textdomain($domain_new);
// all done
?>

Ответы [ 2 ]

0 голосов
/ 29 ноября 2011

Я не думаю, что copy () должна делать что-то волшебное, она должна делать только двоичную копию.Если, может быть, есть некоторые настройки, которые работают глубоко внутри потоковых функций php ...

- сравните содержимое файла, чтобы проверить

printf("%s\n%s", md5_file($filename), md5_file($filename_new));
0 голосов
/ 28 ноября 2011

Не уверен, поможет ли это, но вы пытались сначала установить любое из следующих значений?

mb_internal_encoding('UTF-8');
mb_http_output('UTF-8');
mb_http_input('UTF-8');
mb_language('uni');
mb_regex_encoding('UTF-8');
ob_start('mb_output_handler');

Изменить

Вы также можете использовать3-й параметр в copy() - см. Документы http://uk.php.net/copy - где он может использовать stream_context_create(), чтобы установить заголовок как UTF-8

...