API: Add a check for PHP bug 45314 (PHP's WDDX formatter messes up UTF-8) and fix...
authorRoan Kattouw <catrope@users.mediawiki.org>
Mon, 23 Mar 2009 19:58:07 +0000 (19:58 +0000)
committerRoan Kattouw <catrope@users.mediawiki.org>
Mon, 23 Mar 2009 19:58:07 +0000 (19:58 +0000)
includes/api/ApiFormatJson.php
includes/api/ApiFormatWddx.php

index 7920f73..0159dbf 100644 (file)
@@ -61,7 +61,7 @@ class ApiFormatJson extends ApiFormatBase {
                // Some versions of PHP have a broken json_encode, see PHP bug 
                // 46944. Test encoding an affected character (U+20000) to 
                // avoid this.
-               if (!function_exists('json_encode') || $this->getIsHtml() || strtolower(json_encode("\xf0\xa0\x80\x80")) != '\ud840\udc00') {
+               if (!function_exists('json_encode') || $this->getIsHtml() || strtolower(json_encode("\xf0\xa0\x80\x80")) != '"\ud840\udc00"') {
                        $json = new Services_JSON();
                        $this->printText($prefix . $json->encode($this->getResultData(), $this->getIsHtml()) . $suffix);
                } else {
index 06f1ecc..ac9a53c 100644 (file)
@@ -42,7 +42,13 @@ class ApiFormatWddx extends ApiFormatBase {
        }
 
        public function execute() {
-               if (function_exists('wddx_serialize_value') && !$this->getIsHtml()) {
+               // Some versions of PHP have a broken wddx_serialize_value, see
+               // PHP bug 45314. Test encoding an affected character (U+00A0)
+               // to avoid this.
+               $expected = "<wddxPacket version='1.0'><header/><data><string>\xc2\xa0</string></data></wddxPacket>";
+               if (function_exists('wddx_serialize_value')
+                               && !$this->getIsHtml()
+                               && wddx_serialize_value("\xc2\xa0") != $expected) {
                        $this->printText(wddx_serialize_value($this->getResultData()));
                } else {
                        // Don't do newlines and indentation if we weren't asked
@@ -60,8 +66,8 @@ class ApiFormatWddx extends ApiFormatBase {
        }
 
        /**
-       * Recursivelly go through the object and output its data in WDDX format.
-       */
+        * Recursively go through the object and output its data in WDDX format.
+        */
        function slowWddxPrinter($elemValue, $indent = 0) {
                $indstr = ($this->getIsHtml() ? "" : str_repeat(' ', $indent));
                $indstr2 = ($this->getIsHtml() ? "" : str_repeat(' ', $indent + 2));