详解windows live writer(WLW)发布文章出现乱码问题

2009年4月22日 | 分类: Wordpress | 标签: , , , | 字体: 超大


  小程换了一个新的空间,就像我这里说的一样,我又遇见了更多的问题,总之感觉像是这个空间故意耍我一样,麻烦是一个接一个,弄得我有时候真的有点抓狂了,不过换个角度想想,也算是一种学习吧。

  最新遇见的问题就是在我使用windows live writer(WLW)发表文章的时候,发现会有源码在其中,文章格式什么的全部都没有了,简单的分析了下,原来是发表的文章的源码中的符号“<”和“>”都消失了,所以才会没法正常显示。

  可是这是什么原因造成的呢?我百思不得其解,在网上找了半天解决办法,又发帖询问,都一直没有结果。不过到了最后,功夫不负有心人,我还是找到了解决办法。

  为了搞清楚是windows live writer的问题还是空间的问题,我用windows live writer测试发布在其他地方,一切正常,看来是空间那边的问题。那么是数据库还是说wordpress本身兼容问题呢?我又再测试了一下,重新建立了个博客,新的数据库,发现问题依旧,那说明同wordpress程序和数据库都是没有关系的了。最后,我判定,肯定是空间的问题,肯定是有什么地方不支持造成的。

  接下来又在网上寻找了半天,终于,找到了解决办法,此方法是新克蘭德博客提供的,非常感谢他。

  原来问题真的是在空间方面,本人不懂php,所以也说不出个所以然,大家可以去新克蘭德那看看。

  我也将解决办法贴在下面:

  解决的方法是修改三个文件的代码,非常简单,将下面提供的代码覆盖相应的函数就可以了

  • /wp-admin/import/blogger.php -- function parse($xml)
  • /wp-includes/rss.php -- function MagpieRSS ($source)
  • /wp-includes/class-IXR.php -- function parse()

  注意:在修改的时候请使用专业点的文档编辑软件,不要用记事本修改,因为最后在保存的时候需要另存为“UTF-8”的格式,不然会出错的!这一点在新克蘭德的博客并没有提到,可这是极其重要的一步,望大家一定要记住!!大家可以使用EmEditor编辑软件(点击下载),很不错,小程我一直在使用。

 

首先是修改第一个文件/wp-admin/import/blogger.php中的function parse($xml)

注:如果你使用类似EmEditor的软件编辑的话,可以看到行数,依照下面的行数修改便可以了。

//-----------------------------------------------
// /wp-admin/import/blogger.php  行数913-935
//-----------------------------------------------
    function parse($xml) {
        global $app_logging;
        array_unshift($this->ns_contexts, array());
        $parser = xml_parser_create_ns();
        xml_set_object($parser, $this);
        xml_set_element_handler($parser, "start_element", "end_element");
        xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
        xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,0);
        xml_set_character_data_handler($parser, "cdata");
        xml_set_default_handler($parser, "_default");
        xml_set_start_namespace_decl_handler($parser, "start_ns");
        xml_set_end_namespace_decl_handler($parser, "end_ns");
        $contents = "";
        //xmllib 2.7.0 -2.7.3 stripping leading angle brackets bug patch
        $xml =str_replace("&lt;","&#60;",$xml );
        $xml =str_replace("&gt;","&#62;",$xml );
        $xml =str_replace("&amp;","&#38;",$xml );
        //end Fix
        xml_parse($parser, $xml);
        xml_parser_free($parser);
        return true;
    }

 

接下来是修改/wp-includes/rss.php中的function MagpieRSS ($source)

//-----------------------------------------------
// /wp-includes/rss.php 行数49-90
//-----------------------------------------------
    function MagpieRSS ($source) {
        # if PHP xml isn't compiled in, die
        #
        if ( !function_exists('xml_parser_create') )
            trigger_error( "Failed to load PHP's XML Extension. http://www.php.net/manual/en/ref.xml.php" );
        $parser = @xml_parser_create();
        if ( !is_resource($parser) )
            trigger_error( "Failed to create an instance of PHP's XML parser. http://www.php.net/manual/en/ref.xml.php");
        $this->parser = $parser;
        # pass in parser, and a reference to this object
        # setup handlers
        #
        xml_set_object( $this->parser, $this );
        xml_set_element_handler($this->parser,
                'feed_start_element', 'feed_end_element' );
        xml_set_character_data_handler( $this->parser, 'feed_cdata' );
        //xmllib 2.7.0 -2.7.3 stripping leading angle brackets bug patch
        $source =str_replace("&lt;","&#60;",$source );
        $source =str_replace("&gt;","&#62;",$source );
        $source =str_replace("&amp;","&#38;",$source );
        //end fix
        $status = xml_parse( $this->parser, $source );
        if (! $status ) {
            $errorcode = xml_get_error_code( $this->parser );
            if ( $errorcode != XML_ERROR_NONE ) {
                $xml_error = xml_error_string( $errorcode );
                $error_line = xml_get_current_line_number($this->parser);
                $error_col = xml_get_current_column_number($this->parser);
                $errormsg = "$xml_error at line $error_line, column $error_col";
                $this->error( $errormsg );
            }
        }
        xml_parser_free( $this->parser );
        $this->normalize();
    }

最后是修改/wp-includes/class-IXR.php中的function parse()

//-----------------------------------------------
// /wp-includes/class-IXR.php 行数159-185
//-----------------------------------------------
    function parse() {
        // first remove the XML declaration
        $this->message = preg_replace('/<\?xml(.*)?\?'.'>/', '', $this->message);
        if (trim($this->message) == '') {
            return false;
        }
        $this->_parser = xml_parser_create();
        // Set XML parser to take the case of tags in to account
        xml_parser_set_option($this->_parser, XML_OPTION_CASE_FOLDING, false);
        // Set XML parser callback functions
        xml_set_object($this->_parser, $this);
        xml_set_element_handler($this->_parser, 'tag_open', 'tag_close');
        xml_set_character_data_handler($this->_parser, 'cdata');
        //xmllib 2.7.0 -2.7.3 stripping leading angle brackets bug patch
        $this->message =str_replace("&lt;","&#60;",$this->message);
        $this->message =str_replace("&gt;","&#62;",$this->message);
        $this->message =str_replace("&amp;","&#38;",$this->message);
        //end fix
        if (!xml_parse($this->_parser, $this->message)) {
            /* die(sprintf('XML error: %s at line %d',
                xml_error_string(xml_get_error_code($this->_parser)),
                xml_get_current_line_number($this->_parser))); */
            return false;
        }
        xml_parser_free($this->_parser);
        // Grab the error messages, if any
        if ($this->messageType == 'fault') {
            $this->faultCode = $this->params[0]['faultCode'];
            $this->faultString = $this->params[0]['faultString'];
        }
        return true;
    }

修改好后另存为UTF-8的格式,如图:

然后,将这三个文件上传覆盖原来的,就大功告成了!赶快用windows live writer(WLW)发布篇文章试试去!!

  1. 2009年9月26日14:38

    又是向小程同志学习了,同样的问题我也遇到了,谢谢!!