Zend_Cache: After loading cached data, character encoding seems messed up

爷,独闯天下 提交于 2019-11-29 13:04:48
tawfekov

I have almost identical state like you ,

development machine is windows + php 5.3

development machine is Linux + php 5.2.14

ZF version is 1.10

the only difference i had is : i used to add mb_internal_encoding("UTF-8"); in the bootstrap class

FYI , I used to cache text (arabic language ) from database all encoded UTF8 when i open the file i see the arabic text as expected .

UPDATE : 1- here is my complete initCache function just to make it clear

public function _initCache() {
        mb_internal_encoding("UTF-8");
        $frontendOptions = array(
            'automatic_serialization' => TRUE,
            'lifetime' => 86400
        );
        $backendOptions = array(
            'cache_dir' => APPLICATION_PATH . "/configs/cache/",
                ///'cache_dir' => sys_get_temp_dir(),
        );
        $cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions);
        Zend_Db_Table_Abstract::setDefaultMetadataCache($cache);
        Zend_Registry::set("cache", $cache);
    }

Explanation : 1-Any php version earlier than PHP 6 doesn't have native support for UTF-8 , https://stackoverflow.com/questions/716703/what-is-coming-in-php-6

2-making php 5.3 or 5.2 deal with UTF8 by using ICONV or MB_STRING

simply by using var_dump(mb_internal_encoding());

you can tell that php using ISO-8859-1 internally ,

you can override it by var_dump(mb_internal_encoding("UTF-8"));

it would output true (it success to override the internal encoding )

to be honest i don't know if there is better solution or how bad it is ?? ,

if you had any better i would be happy to adopt it :)

UPDATE 2 in case you don't want to use that function , open this file "Zend/Cache/Backend/File.php" and go to the line 976 change this :

protected function _filePutContents($file, $string)
{

    $result = false;
    $f = @fopen($file, 'ab+');
    if ($f) {
        if ($this->_options['file_locking']) @flock($f, LOCK_EX);
        fseek($f, 0);
        ftruncate($f, 0);
        $tmp = @fwrite($f, $string);
        if (!($tmp === FALSE)) {
            $result = true;
        }
        @fclose($f);
    }
    @chmod($file, $this->_options['cache_file_umask']);
    return $result;
}

to be this :

protected function _filePutContents($file, $string)
{
    $string = mb_convert_encoding($string   , "UTF-8" , "ISO-8859-1"); // i didn't test it , use it at your own risk and i'd rather stick with the first solution 
    $result = false;
    $f = @fopen($file, 'ab+');
    if ($f) {
        if ($this->_options['file_locking']) @flock($f, LOCK_EX);
        fseek($f, 0);
        ftruncate($f, 0);
        $tmp = @fwrite($f, $string);
        if (!($tmp === FALSE)) {
            $result = true;
        }
        @fclose($f);
    }
    @chmod($file, $this->_options['cache_file_umask']);
    return $result;
}

i didn't test manually but it should work as expected

Glad it helped !

Can you check LC_LANG and other language variables? Apart from your problem :

I have problem with my cache files, between my hosting and local server (one debian, one ubuntu) I discovered the problem, when serializing \r causes problem. One system saves \r but ignores counting.

So I before serializing, remove all \r from the string. That removed!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!