Changeset 1058

Show
Ignore:
Timestamp:
11/21/07 21:40:44 (9 months ago)
Author:
mikey
Message:

bugfix: do not encode in UTF-8 if string is already encoded in UTF-8

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/src/main/php/net/stubbles/xml/stubDomXMLStreamWriter.php

    r1019 r1058  
    8989     * Write a text node 
    9090     * 
    91      * Data has to be encoded even if document encoding is not UTF-8 
    92      * 
    9391     * @param string $data 
    94      * @link  http://php.net/manual/en/function.dom-domdocument-save.php#67952 
    9592     */ 
    9693    public function writeText($data) 
     
    9895        try { 
    9996            libxml_use_internal_errors(true); 
    100             $textNode = $this->doc->createTextNode(utf8_encode($data)); 
     97            $textNode = $this->doc->createTextNode($this->encode($data)); 
    10198            $this->addToDom($textNode); 
    10299            $errors = libxml_get_errors(); 
     
    118115        try { 
    119116            libxml_use_internal_errors(true); 
    120             $cdataNode = $this->doc->createCDATASection(utf8_encode($cdata)); 
     117            $cdataNode = $this->doc->createCDATASection($this->encode($cdata)); 
    121118            $this->addToDom($cdataNode); 
    122119            $errors = libxml_get_errors(); 
     
    138135        try { 
    139136            libxml_use_internal_errors(true); 
    140             $commentNode = $this->doc->createComment(utf8_encode($comment)); 
     137            $commentNode = $this->doc->createComment($this->encode($comment)); 
    141138            $this->addToDom($commentNode); 
    142139            $errors = libxml_get_errors(); 
     
    159156        try { 
    160157            libxml_use_internal_errors(true); 
    161             $piNode = $this->doc->createProcessingInstruction($target, utf8_encode($data)); 
     158            $piNode = $this->doc->createProcessingInstruction($target, $data); 
    162159            $this->addToDom($piNode); 
    163160            $errors = libxml_get_errors(); 
     
    202199            libxml_use_internal_errors(true); 
    203200            $currentElement = end($this->elementStack); 
    204             $currentElement->setAttribute($attributeName, utf8_encode($attributeValue)); 
     201            $currentElement->setAttribute($attributeName, $this->encode($attributeValue)); 
    205202            $errors = libxml_get_errors(); 
    206203            if (!empty($errors)) { 
     
    321318        return implode(', ', $messages); 
    322319    } 
     320 
     321    /** 
     322     * helper method to transform data into correct encoding 
     323     *  
     324     * Data has to be encoded even if document encoding is not UTF-8. 
     325     * 
     326     * @param   string  $data 
     327     * @return  string 
     328     * @see     http://php.net/manual/en/function.dom-domdocument-save.php#67952 
     329     */ 
     330    protected function encode($data) 
     331    { 
     332        if (mb_detect_encoding($data, 'UTF-8, ISO-8859-1') === 'UTF-8') { 
     333            return $data; 
     334        } 
     335         
     336        return utf8_encode($data); 
     337    } 
    323338} 
    324339?> 
  • trunk/src/test/php/net/stubbles/xml/stubDomXMLStreamWriterTestCase.php

    r1019 r1058  
    7171 
    7272    /** 
     73     * Test creating a document with attributes 
     74     */ 
     75    public function testAttributesWithGermanUmlauts() { 
     76        $writer = new stubDomXMLStreamWriter(); 
     77        $writer->writeStartElement('root'); 
     78        $writer->writeStartElement('foo'); 
     79        $writer->writeAttribute('bar', 'häößü'); 
     80        $writer->writeEndElement(); 
     81        $writer->writeEndElement(); 
     82 
     83        $this->assertEqual('<?xml version="1.0" encoding="UTF-8"?>' . "\n". '<root><foo bar="' . utf8_encode('häößü') . '"/></root>', $writer->asXML()); 
     84    } 
     85 
     86    /** 
     87     * Test creating a document with attributes 
     88     */ 
     89    public function testAttributesWithGermanUmlautsUTF8() { 
     90        $writer = new stubDomXMLStreamWriter(); 
     91        $writer->writeStartElement('root'); 
     92        $writer->writeStartElement('foo'); 
     93        $writer->writeAttribute('bar', utf8_encode('häößü')); 
     94        $writer->writeEndElement(); 
     95        $writer->writeEndElement(); 
     96 
     97        $this->assertEqual('<?xml version="1.0" encoding="UTF-8"?>' . "\n". '<root><foo bar="' . utf8_encode('häößü') . '"/></root>', $writer->asXML()); 
     98    } 
     99 
     100    /** 
    73101     * Test creating a document with a text node 
    74102     */ 
     
    95123 
    96124    /** 
     125     * Test creating a document with a text node containing german umlauts. 
     126     */ 
     127    public function testTextWithGermanUmlautsInUTF8() { 
     128        $writer = new stubDomXMLStreamWriter(); 
     129        $writer->writeStartElement('root'); 
     130        $writer->writeText(utf8_encode('This is text containg äöü.')); 
     131        $writer->writeEndElement(); 
     132 
     133        $this->assertEqual('<?xml version="1.0" encoding="UTF-8"?>' . "\n". '<root>This is text containg ' . utf8_encode('äöü') . '.</root>', $writer->asXML()); 
     134    } 
     135 
     136    /** 
    97137     * Test creating a document with character data 
    98138     */ 
     
    107147 
    108148    /** 
     149     * Test creating a document with character data 
     150     */ 
     151    public function testCDataWithGermanUmlauts() { 
     152        $writer = new stubDomXMLStreamWriter(); 
     153        $writer->writeStartElement('root'); 
     154        $writer->writeCData('This is text containing äöü.'); 
     155        $writer->writeEndElement(); 
     156 
     157        $this->assertEqual('<?xml version="1.0" encoding="UTF-8"?>' . "\n". '<root><![CDATA[This is text containing ' . utf8_encode('äöü') . '.]]></root>', $writer->asXML()); 
     158    } 
     159 
     160    /** 
     161     * Test creating a document with character data 
     162     */ 
     163    public function testCDataWithGermanUmlautsUTF8() { 
     164        $writer = new stubDomXMLStreamWriter(); 
     165        $writer->writeStartElement('root'); 
     166        $writer->writeCData(utf8_encode('This is text containing äöü.')); 
     167        $writer->writeEndElement(); 
     168 
     169        $this->assertEqual('<?xml version="1.0" encoding="UTF-8"?>' . "\n". '<root><![CDATA[This is text containing ' . utf8_encode('äöü') . '.]]></root>', $writer->asXML()); 
     170    } 
     171 
     172    /** 
    109173     * Test creating a document with a comment 
    110174     */ 
     
    116180 
    117181        $this->assertEqual('<?xml version="1.0" encoding="UTF-8"?>' . "\n". '<root><!--This is a comment.--></root>', $writer->asXML()); 
     182    } 
     183 
     184    /** 
     185     * Test creating a document with a comment 
     186     */ 
     187    public function testCommentWithGermanUmlauts() { 
     188        $writer = new stubDomXMLStreamWriter(); 
     189        $writer->writeStartElement('root'); 
     190        $writer->writeComment('This is a comment containing äöü.'); 
     191        $writer->writeEndElement(); 
     192 
     193        $this->assertEqual('<?xml version="1.0" encoding="UTF-8"?>' . "\n". '<root><!--This is a comment containing ' . utf8_encode('äöü') . '.--></root>', $writer->asXML()); 
     194    } 
     195 
     196    /** 
     197     * Test creating a document with a comment 
     198     */ 
     199    public function testCommentWithGermanUmlautsUTF8() { 
     200        $writer = new stubDomXMLStreamWriter(); 
     201        $writer->writeStartElement('root'); 
     202        $writer->writeComment(utf8_encode('This is a comment containing äöü.')); 
     203        $writer->writeEndElement(); 
     204 
     205        $this->assertEqual('<?xml version="1.0" encoding="UTF-8"?>' . "\n". '<root><!--This is a comment containing ' . utf8_encode('äöü') . '.--></root>', $writer->asXML()); 
    118206    } 
    119207