Chinaunix

标题: XML::Simple 解析中文问题 [打印本页]

作者: lvlfforever    时间: 2009-11-18 14:11
标题: XML::Simple 解析中文问题
use XML::Simple;
use Data::Dumper;

my $str = '<xml><a>我的祖国</a></xml>';
my $xml = new XML::Simple;
my $t   = XMLin($str);
print Dumper $t;


#结果:
$VAR1 = {
          'a' => '锟揭碉拷锟斤拷锟斤拷'
        };

请问如何处理? 另外这是什么原因导致?我知道XML::Simple 默认用XML::SAX解析。
我系统是gb2312编码
作者: wxlfh    时间: 2009-11-18 14:38
我的感觉是你应该要告诉XML::Simple,你的XML文件是什么编码的。
作者: nsnake    时间: 2009-11-18 15:05
XML::Simple有编码属性选择,如果不会用用encode等模块自己转换也可以,只要2边的编码一样就不会有什么问题
作者: lvlfforever    时间: 2009-11-18 15:10
encode 怎么转?

XML::Simple有编码属性,请指教。
作者: hitsubunnu    时间: 2009-11-18 15:13
1.不乱码的原则是:

保持 程序文件  输入文件 输出文件  3者统一

不统一的部分使用 use Encode 转换

2. 转码时 注意 宽字符 用encode方法转换
作者: hitsubunnu    时间: 2009-11-18 15:14
原帖由 lvlfforever 于 2009-11-18 15:10 发表
encode 怎么转?

XML::Simple有编码属性,请指教。


  1. use Encode;

  2. # utf-8 => gb2312
  3. $str =encode("gb2312",decode("utf-8",$str));
复制代码

作者: lvlfforever    时间: 2009-11-18 15:26
原帖由 hitsubunnu 于 2009-11-18 15:14 发表



use Encode;

# utf-8 => gb2312
$str =encode("gb2312",decode("utf-8",$str));


按照hitsubunnu 的做法:

use Encode;
use XML::Simple;
use Data::Dumper;
my $str = '<xml><a>我的祖国</a></xml>';
my $xml = new XML::Simple;
my $t   = XMLin($str);
my $s   = $t->{a};;
print "[$s]n";
my $sg  =encode("gb2312",decode("utf-8",$s));
print "[$sg]n";


输出是一连串问号。我环境已经说了,请看楼顶。谢谢
作者: hitsubunnu    时间: 2009-11-18 15:29
原帖由 lvlfforever 于 2009-11-18 15:26 发表


按照hitsubunnu 的做法:

use Encode;
use XML::Simple;
use Data:umper;
my $str = '我的祖国';
my $xml = new XML::Simple;
my $t   = XMLin($str);
my $s   = $t->{a};;
print "[$s]n";
my ...


你认真读我写的这段话了吗?

不乱码的原则是:

保持 程序文件  输入文件 输出文件  3者统一

不统一的部分使用 use Encode 转换

作者: lvlfforever    时间: 2009-11-18 15:34
原帖由 hitsubunnu 于 2009-11-18 15:29 发表


你认真读我写的这段话了吗?

不乱码的原则是:

保持 程序文件  输入文件 输出文件  3者统一

不统一的部分使用 use Encode 转换



首先:没有输入文件。
程序文件也是gb2312跟系统编码一致。
不统一的部分使用 use Encode 转换:
  “my $sg  =encode("gb2312",decode("utf8",$s));”
请问是我理解错了么?
作者: lvlfforever    时间: 2009-11-18 15:35
另外输出文件就是屏幕,也跟系统一致。
作者: hitsubunnu    时间: 2009-11-18 15:39
原帖由 lvlfforever 于 2009-11-18 15:35 发表
另外输出文件就是屏幕,也跟系统一致。

全换成 utf8 试
作者: lvlfforever    时间: 2009-11-18 15:54
原帖由 hitsubunnu 于 2009-11-18 15:39 发表

全换成 utf8 试


不行。
问题的关键没有找到。继续求教吧。
作者: infernor    时间: 2009-11-18 15:59
原帖由 lvlfforever 于 2009-11-18 15:26 发表


按照hitsubunnu 的做法:

use Encode;
use XML::Simple;
use Data:umper;
my $str = '我的祖国';
my $xml = new XML::Simple;
my $t   = XMLin($str);
my $s   = $t->{a};;
print "[$s]n";
my ...


你把数据传入到XML::Simple之前,先转换成utf8。
作者: lvlfforever    时间: 2009-11-18 16:17
use strict;
use warnings;
use Encode ;
use XML::Simple;
use Data::Dumper;
my $str = '<xml><a>我的祖国</a></xml>';
###$str    =~ s/([x{80}-x{FFFF}])/'&#' . ord($1) . ';'/gse;

my $xml = new XML::Simple;
my $t   = XMLin($str);
my $s   = $t->{a};;
print "[$s]n";


通过查询:http://perl-xml.sourceforge.net/faq/ 打开注释就可以解决了。
不知有没有更好的方法。
作者: nsnake    时间: 2009-11-19 13:00
我记错了XML::Simple没有这个属性,而是XML::Parser  
open(FOO, 'xmlgenerator |');
$p3->parse(*FOO, ProtocolEncoding => 'ISO-8859-1');
close(FOO);
不乱码的问题别人也说过了,其实说的简单点:你解析的文件编码(gb2312),你代码文件保存的编码(gb2312),你控制台的编码(gb2312),这三点统一才能保证你看到的不是乱码,看上去很简单,但实际上很多人很难理解,你用编辑器写代码,可能它默认会给你存为utf8的格式。
控制台的编码:如果你用的是DOS窗口,它默认就是gb2312,但如果是其它控制台,也许是拉丁字符也说不定
如果还有问题,那很简单了,换个模块试下,没必要吊死在一棵树上。
求问要有耐心,我们最多给你指个方向,但不可能带着你走

[ 本帖最后由 nsnake 于 2009-11-19 13:02 编辑 ]
作者: wxlfh    时间: 2009-11-19 14:13
楼上正解,控制台的编码其实是最关键的。输出到控制台的时候,编码一定要和控制台一致。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2