http://qs321.pair.com?node_id=1199889


in reply to Problem upgrading XML::Fast from 0.11 to 0.17

Hi mje,

maybe this diff is helpful.

there is a change in the xs file:

-SV* -_xml2hash(xml,conf) - char *xml; +void +_xml2hash(xml_sv,conf) + SV *xml_sv; HV *conf; PROTOTYPE: $$ - CODE: + PPCODE: + SvGETMAGIC(xml_sv); + char *xml = SvPVbyte_nolen(xml_sv);

after all without adding the utf8decode option xml2hash marks your hash value as utf8.

Replies are listed 'Best First'.
Re^2: Problem upgrading XML::Fast from 0.11 to 0.17
by ikegami (Patriarch) on Sep 22, 2017 at 17:11 UTC

    SvPVbyte_nolen already handles magic, so the SvGETMAGIC(xml_sv) is superfluous and should be eliminated. Otherwise, this change does indeed fix a bug in the module.

      LOL! Just noticed I submitted the change, including the superfluous SvGETMAGIC(xml_sv). I'll let the maintainer know.

Re^2: Problem upgrading XML::Fast from 0.11 to 0.17
by mje (Curate) on Sep 22, 2017 at 10:36 UTC

    Thanks for that ablanke.

    I don't understand this change. I've read in a correctly ISO-8859-1 encoded file and used the same encoding layer when opening it. I then pass it to xml2hash and get rubbish out unless I set this ambiguous utf8decode option documented as "Force decoding of utf8 sequences, instead of just upgrading them (may be useful for broken xml)". My XML is not broken.

    $ od -c xx.XML 0000000 < ? x m l v e r s i o n = " +1 0000020 . 0 " e n c o d i n g = " I +S 0000040 O - 8 8 5 9 - 1 " ? > \n < x x + 0000060 f e e d t y p e = " d e l t a +" 0000100 > < T i m e s t a m p C r e +a 0000120 t e d T i m e = " 2 0 1 7 - 0 +9 0000140 - 2 1 T 0 6 : 4 9 : 1 7 " T +i 0000160 m e Z o n e = " G M T " / > < +V 0000200 a l u e > B r 370 n d b y I F +< 0000220 / V a l u e > < / x x > \n 0000235

    Note the 370 octal which is F8 and "ø". This also looks correct to me:

    $ perl -le 'use 5.016;use Devel::Peek; my $xml = do {local $/ = undef; + open(my $fh, "<:encoding(ISO-8859-1)", "xx.XML"); <$fh>;}; say Dump +($xml);' SV = PV(0x1a25da0) at 0x1a3a010 REFCNT = 1 FLAGS = (POK,IsCOW,pPOK,UTF8) PV = 0x1c22ea0 "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n<xx + feedtype=\"delta\"><Timestamp CreatedTime=\"2017-09-21T06:49:17\" Ti +meZone=\"GMT\"/><Value>Br\303\270ndby IF</Value></xx>\n"\0 [UTF8 "<?x +ml version="1.0" encoding="ISO-8859-1"?>\n<xx feedtype="delta"><Times +tamp CreatedTime="2017-09-21T06:49:17" TimeZone="GMT"/><Value>Br\x{f8 +}ndby IF</Value></xx>\n"] CUR = 158 LEN = 160 COW_REFCNT = 1