Re: encode/decodeXMLEntities

From: Date: Wed, 05 Nov 2003 08:19:30 +0000
Subject: Re: encode/decodeXMLEntities
References: 1 2  Groups: php.pear.dev 
Request: Send a blank email to pear-dev+get-23250@lists.php.net to get a copy of this message
Ok.. Here's the function... Must save as UTF8 and the $xml variable MUST be UTF8 The better way would be to have a table/$encoder with all the possible PHP Internal Encodings... Try this out...see if Sablotron craps out on any codes
    function encodeXmlEntities($xml)
    {
        $encoder = array(
chr(0) => '',chr(1) => '',chr(2) => '',chr(3) => '',chr(4) => '',chr(5) => '',chr(6) => '',chr(7) => '',chr(8) => '',
chr(11) => '',chr(12) => '',chr(14) => '',chr(15) => '',chr(16) => '',chr(17) => '',chr(18) => '',chr(19) => '',
chr(20) => '',chr(21) => '',chr(22) => '',chr(23) => '',chr(24) => '',chr(25) => '',chr(26) => '',chr(27) => '',
chr(28) => '',chr(29) => '',chr(30) => '',chr(31) => '',chr(34) => '"',chr(38) => '&',
chr(60) => '<',chr(62) => '>', ' '=>' ', '¡'=>'¡', '¢'=>'¢', '£'=>'£',
'¤'=>'¤', '¥'=>'¥', '¦'=>'¦', '§'=>'§', '¨'=>'¨', '©'=>'©', 'ª'=>'ª',
'«'=>'«', '¬'=>'¬', '­'=>'­', '®'=>'®', '¯'=>'¯', '°'=>'°', '±'=>'±', '²'=>'²',
'³'=>'³', '´'=>'´', 'µ'=>'µ', '¶'=>'¶', '·'=>'·', '¸'=>'¸', '¹'=>'¹', 'º'=>'º',
'»'=>'»', '¼'=>'¼', '½'=>'½', '¾'=>'¾','¿'=> '¿',
'À'=> 'À','Á'=> 'Á','Â'=> 'Â','Ã'=> 'Ã','Ä'=> 'Ä','Å'=> 'Å',
'Æ'=> 'Æ','Ç'=> 'Ç','È'=> 'È','É'=> 'É','Ê'=> 'Ê','Ë'=> 'Ë',
'Ì'=> 'Ì','Í'=> 'Í','Î'=> 'Î','Ï'=> 'Ï','Ð'=> 'Ð','Ñ'=> 'Ñ',
'Ò'=> 'Ò','Ó'=> 'Ó','Ô'=> 'Ô','Õ'=> 'Õ','Ö'=> 'Ö','×'=> '×',
'Ø'=> 'Ø','Ù'=> 'Ù','Ú'=> 'Ú','Û'=> 'Û','Ü'=> 'Ü','Ý'=> 'Ý',
'Þ'=> 'Þ','ß'=> 'ß','à'=> 'à','á'=> 'á','â'=> 'â','ã'=> 'ã',
'ä'=> 'ä','å'=> 'å','æ'=> 'æ','ç'=> 'ç','è'=> 'è','é'=> 'é',
'ê'=> 'ê','ë'=> 'ë','ì'=> 'ì','í'=> 'í','î'=> 'î','ï'=> 'ï',
'ð'=> 'ð','ñ'=> 'ñ','ò'=> 'ò','ó'=> 'ó','ô'=> 'ô','õ'=> 'õ',
'ö'=> 'ö','÷'=> '÷','ø'=> 'ø','ù'=> 'ù','ú'=> 'ú','û'=> 'û',
'ü'=> 'ü','ý'=> 'ý','þ'=> 'þ','ÿ'=> 'ÿ');
        $newstr="";
        for ($i=0; $i<strlen($xml); $i++)
        {
            // substring is character safe with mbstring overloading...
            $c=substr($xml,$i,1);
            if (array_key_exists($c,$encoder))
               $newstr.=$encoder[$c];
            else
               $newstr.=$c;
        }
        return $newstr;
    }
James Barwick wrote:
In a fit of inspiration this morning...the following code works!!!!
    /**
    * Escape XML entities.
    *
    * @param   string  xml      Text string to escape.
    *
    * @return  string  xml
    * @access  public
    */
    function encodeXmlEntities($xml)
    {
        $encoder = array(
            chr(0) => '&#000;',chr(1) => '&#001;',chr(2) => '&#002;',chr(3) => '&#003;',chr(4) => '&#004;',chr(5) => '&#005;',chr(6) => '&#006;',chr(7) => '&#007;',chr(8) => '&#008;',chr(9) => '&#009;',
            chr(10) => '&#010;',chr(11) => '&#011;',chr(12) => '&#012;',chr(13) => '&#013;',chr(14) => '&#014;',chr(15) => '&#015;',chr(16) => '&#016;',chr(17) => '&#017;',chr(18) => '&#018;',chr(19) => '&#019;',
            chr(20) => '&#020;',chr(21) => '&#021;',chr(22) => '&#022;',chr(23) => '&#023;',chr(24) => '&#024;',chr(25) => '&#025;',chr(26) => '&#026;',chr(27) => '&#027;',chr(28) => '&#028;',chr(29) => '&#029;',
            chr(30) => '&#030;',chr(31) => '&#031;',chr(34) => '&#034;',chr(38) => '&#038;',
            chr(60) => '&#060;',chr(62) => '&#062;',
            chr(127) => '&#127;',chr(128) => '&#128;',chr(129) => '&#129;',
            chr(130) => '&#130;',chr(131) => '&#131;',chr(132) => '&#132;',chr(133) => '&#133;',chr(134) => '&#134;',chr(135) => '&#135;',chr(136) => '&#136;',chr(137) => '&#137;',chr(138) => '&#138;',chr(139) => '&#139;',
            chr(140) => '&#140;',chr(141) => '&#141;',chr(142) => '&#142;',chr(143) => '&#143;',chr(144) => '&#144;',chr(145) => '&#145;',chr(146) => '&#146;',chr(147) => '&#147;',chr(148) => '&#148;',chr(149) => '&#149;',
            chr(150) => '&#150;',chr(151) => '&#151;',chr(152) => '&#152;',chr(153) => '&#153;',chr(154) => '&#154;',chr(155) => '&#155;',chr(156) => '&#156;',chr(157) => '&#157;',chr(158) => '&#158;',chr(159) => '&#159;',
            chr(160) => '&#160;',chr(161) => '&#161;',chr(162) => '&#162;',chr(163) => '&#163;',chr(164) => '&#164;',chr(165) => '&#165;',chr(166) => '&#166;',chr(167) => '&#167;',chr(168) => '&#168;',chr(169) => '&#169;',
            chr(170) => '&#170;',chr(171) => '&#171;',chr(172) => '&#172;',chr(173) => '&#173;',chr(174) => '&#174;',chr(175) => '&#175;',chr(176) => '&#176;',chr(177) => '&#177;',chr(178) => '&#178;',chr(179) => '&#179;',
            chr(180) => '&#180;',chr(181) => '&#181;',chr(182) => '&#182;',chr(183) => '&#183;',chr(184) => '&#184;',chr(185) => '&#185;',chr(186) => '&#186;',chr(187) => '&#187;',chr(188) => '&#188;',chr(189) => '&#189;',
            chr(190) => '&#190;',chr(191) => '&#191;',chr(192) => '&#192;',chr(193) => '&#193;',chr(194) => '&#194;',chr(195) => '&#195;',chr(196) => '&#196;',chr(197) => '&#197;',chr(198) => '&#198;',chr(199) => '&#199;',
            chr(200) => '&#200;',chr(201) => '&#201;',chr(202) => '&#202;',chr(203) => '&#203;',chr(204) => '&#204;',chr(205) => '&#205;',chr(206) => '&#206;',chr(207) => '&#207;',chr(208) => '&#208;',chr(209) => '&#209;',
            chr(210) => '&#210;',chr(211) => '&#211;',chr(212) => '&#212;',chr(213) => '&#213;',chr(214) => '&#214;',chr(215) => '&#215;',chr(216) => '&#216;',chr(217) => '&#217;',chr(218) => '&#218;',chr(219) => '&#219;',
            chr(220) => '&#220;',chr(221) => '&#221;',chr(222) => '&#222;',chr(223) => '&#223;',chr(224) => '&#224;',chr(225) => '&#225;',chr(226) => '&#226;',chr(227) => '&#227;',chr(228) => '&#228;',chr(229) => '&#229;',
            chr(230) => '&#230;',chr(231) => '&#231;',chr(232) => '&#232;',chr(233) => '&#233;',chr(234) => '&#234;',chr(235) => '&#235;',chr(236) => '&#236;',chr(237) => '&#237;',chr(238) => '&#238;',chr(239) => '&#239;',
            chr(240) => '&#240;',chr(241) => '&#241;',chr(242) => '&#242;',chr(243) => '&#243;',chr(244) => '&#244;',chr(245) => '&#245;',chr(246) => '&#246;',chr(247) => '&#247;',chr(248) => '&#248;',chr(249) => '&#249;',
            chr(250) => '&#250;',chr(251) => '&#251;',chr(252) => '&#252;',chr(253) => '&#253;',chr(254) => '&#254;',chr(255) => '&#255;');
        $newstr="";
        for ($i=0; $i<strlen($xml); $i++)
        {
            // substring is character safe with mbstring overloading...
            $c=substr($xml,$i,1);
            if (array_key_exists($c,$encoder))
               $newstr.=$encoder[$c];
            else
               $newstr.=$c;
        }
        return $newstr;
    }
This code should be implemented in XML/Tree/Node.php as soon as possible so that we can all work with UTF8!!!! Any critisism? Feedback? I hope the PEAR developers are reading this...perhaps an email directly to Christian will help.... James James Barwick wrote:
Followup - This works for me: Modification of XML/Tree/Node.php function encodeXmlEntities($xml)
    {
        $chrs      = chr(0).chr(1).chr(2).chr(3).chr(4).chr(5).chr(6).chr(7).chr(8).chr(9).
chr(10).chr(11).chr(12).chr(13).chr(14).chr(15).chr(16).chr(17).chr(18).chr(19). chr(20).chr(21).chr(22).chr(23).chr(24).chr(25).chr(26).chr(27).chr(28).chr(29).
                      chr(30).chr(31).chr(34).chr(38).
                      chr(60).chr(62).
                      chr(127).chr(128).chr(129).
chr(130).chr(131).chr(132).chr(133).chr(134).chr(135).chr(136).chr(137).chr(138).chr(139). chr(140).chr(141).chr(142).chr(143).chr(144).chr(145).chr(146).chr(147).chr(148).chr(149). chr(150).chr(151).chr(152).chr(153).chr(154).chr(155).chr(156).chr(157).chr(158).chr(159). chr(160).chr(161).chr(162).chr(163).chr(164).chr(165).chr(166).chr(167).chr(168).chr(169). chr(170).chr(171).chr(172).chr(173).chr(174).chr(175).chr(176).chr(177).chr(178).chr(179). chr(180).chr(181).chr(182).chr(183).chr(184).chr(185).chr(186).chr(187).chr(188).chr(189). chr(190).chr(191).chr(192).chr(193).chr(194).chr(195).chr(196).chr(197).chr(198).chr(199). chr(200).chr(201).chr(202).chr(203).chr(204).chr(205).chr(206).chr(207).chr(208).chr(209). chr(210).chr(211).chr(212).chr(213).chr(214).chr(215).chr(216).chr(217).chr(218).chr(219). chr(220).chr(221).chr(222).chr(223).chr(224).chr(225).chr(226).chr(227).chr(228).chr(229). chr(230).chr(231).chr(232).chr(233).chr(234).chr(235).chr(236).chr(237).chr(238).chr(239). chr(240).chr(241).chr(242).chr(243).chr(244).chr(245).chr(246).chr(247).chr(248).chr(249). chr(250).chr(251).chr(252).chr(253).chr(254).chr(255); $repchrs=array('&#000;','&#001;','&#002;','&#003;','&#004;','&#005;','&#006;','&#007;','&#008;','&#009;', '&#010;','&#011;','&#012;','&#013;','&#014;','&#015;','&#016;','&#017;','&#018;','&#019;', '&#020;','&#012;','&#022;','&#023;','&#024;','&#025;','&#026;','&#027;','&#028;','&#029;',
                       '&#030;','&#031;','&#034;','&#038;',
                       '&#060;','&#062;',
                       '&#127;','&#128;','&#129;',
'&#130;','&#131;','&#132;','&#133;','&#134;','&#135;','&#136;','&#137;','&#138;','&#139;', '&#140;','&#141;','&#142;','&#143;','&#144;','&#145;','&#146;','&#147;','&#148;','&#149;', '&#150;','&#151;','&#152;','&#153;','&#154;','&#155;','&#156;','&#157;','&#158;','&#159;', '&#160;','&#161;','&#162;','&#163;','&#164;','&#165;','&#166;','&#167;','&#168;','&#169;', '&#170;','&#171;','&#172;','&#173;','&#174;','&#175;','&#176;','&#177;','&#178;','&#179;', '&#180;','&#181;','&#182;','&#183;','&#184;','&#185;','&#186;','&#187;','&#188;','&#189;', '&#190;','&#191;','&#192;','&#193;','&#194;','&#195;','&#196;','&#197;','&#198;','&#199;', '&#200;','&#201;','&#202;','&#203;','&#204;','&#205;','&#206;','&#207;','&#208;','&#209;', '&#210;','&#211;','&#212;','&#213;','&#214;','&#215;','&#216;','&#217;','&#218;','&#219;', '&#220;','&#221;','&#222;','&#223;','&#224;','&#225;','&#226;','&#227;','&#228;','&#229;', '&#230;','&#231;','&#232;','&#233;','&#234;','&#235;','&#236;','&#237;','&#238;','&#239;', '&#240;','&#241;','&#242;','&#243;','&#244;','&#245;','&#246;','&#247;','&#248;','&#249;', '&#250;','&#251;','&#252;','&#253;','&#254;','&#255;');
        $newstr="";
        for ($i=0; $i<strlen($xml); $i++)
        {
           // substring is character safe with mbstring overloading...
           $c=substr($xml,$i,1);
           $x=strpos($chrs,$c);  // this is broken if the double-byte character is a sequence in the above array
                                 // any suggestions?  can I check if only one byte long?  how?
           if ($x===false) $newstr.=$c; else $newstr.=$repchrs[$x];
        }
        return $newstr;
    }
But I need help finishing... Any way to speed this up? Seems like a slow way to do it...but...may be the only way... And...need to fix a the bug noted above... I tried to be clever doing strpos...but...think I may need to change my mind and scan an array myself.. any help?


« previous php.pear.dev (#23250) next »