确认你的po是不是utf-8编码吧, 我遇到同样的问题
后来直接拿了一个已经是UTF-8的po文件,修改内容就能解决问题了.现在我的多语言是存到数据库里, 再用php导出写成po,自动编译成mo的,就再没有这个问题了.(我的php当然都是utf-8了)

解决方案 »

  1.   

    /**
     * 语言编译,生成po和mo文件
     *
     * @param 语言编码 $LangCode  
     * @return bool
     */
    public function complie($LangCode){
        $fileName = $LangCode . '.po';
        $LangRoot = LOCALE_PATH;
        if (!is_dir($LangRoot . $LangCode)){
           mkdir($LangRoot . $LangCode);
           mkdir($LangRoot . $LangCode . '/' . 'LC_MESSAGES');
        }
        $LangFullPath = $LangRoot . $LangCode . '/' . 'LC_MESSAGES/';    
        if (!is_writeable($LangFullPath)){
            throw new Exception($LangFullPath . ' can not be write');
        }
        
        $data = $this->listTran($LangCode);
        $fp = fopen($LangFullPath.$fileName,'w+');
        flock($fp,LOCK_EX);
        
        
        foreach ($data as $row){
            if (isset($row['F_TEXT']) && $row['F_TEXT'] != ''){
                fputs($fp,"msgid \"".str_replace("\\'","'",$row['F_CODE_DICT'])."\"\n");
        fputs($fp,"msgstr \"".str_replace("\\'","'",$row['F_TEXT'])."\"\n");
    fputs($fp,"\n");
            }
        }
        flock($fp,LOCK_UN);
        fclose($fp);
        
        $ComplieCmd = $this->_msgfmt . ' -o ' . $LangFullPath . $LangCode . '.mo ' . $LangFullPath . $fileName;     
        exec($ComplieCmd);
        return true;
    }