Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   отправка и кодировка XML и повторное нажатие кнопки (2 вопроса) (http://www.flasher.ru/forum/showthread.php?t=113720)

BlooDHounD 09.07.2008 12:22

Leonik, Flash работает только с UTF-8. никакой ISO, у вас быть не могло. rquest.requestHeaders - это строчку флэшу не командир.

Ноябрь 09.07.2008 12:26

Цитата:

он юзает ISO
гы гы

wvxvw 09.07.2008 12:29

а по-моему, если выставить useCodepage в true, то будет отсылаться не UTF-8, a ISO... соответствующая юзерским настройкам...
вечером проверю, над на работу идти =)

wvxvw 12.07.2008 01:03

Вот, двое суток не ел и не спал, практически =)))
Собственно, что это все делает:
Позволяет во флешке закодировать ХМЛ в одну из быбраных кодировок, отослать ПХП и в ПХП мы можем узнать в какой кодировке к нам пришла строка и по желанию конвертнуть ее во что-то другое. Немного бесцельное занятие, т.как я бы просто все делал в УТФ-8, но иногда бывает нужно (фз зачем, но мало ли), чтобы ХМЛ на сервере сохранился в отличной от УТФ-8 кодировке... Вобщем, вот:
Код:

package
{
        import flash.display.Sprite;
        import org.wvxvw.phputils.XMLSender;
       
        public class Main extends Sprite
        {
                public var xs:XMLSender;
                public var testXML:XML =
                <xml>
                        <English>
                        English text
                        </English>
                        <Russian>
                        текст по - русски
                        </Russian>
                       
                </xml>;
               
                public function Main():void
                {
                        xs = new XMLSender();
                        xs.sendXML(testXML, 'http://localhost/flashtest/flashreceiver.php', XMLSender.WINDOWS_1251);
                }
        }
}

Код:

/**
* ...
* @author wvxvw
*/
package  org.wvxvw.phputils
{
        import flash.events.EventDispatcher;
        import flash.events.Event;
        import flash.events.IOErrorEvent;
        import flash.events.SecurityErrorEvent;
        import flash.net.URLLoader;
        import flash.net.URLRequest;
        import flash.net.URLLoaderDataFormat;
        import flash.net.URLRequestMethod;
        import flash.net.URLRequestHeader;
        import flash.utils.ByteArray;
        import flash.utils.Endian;
       
        public class XMLSender extends EventDispatcher
        {
                public static const US_ASCII:String = 'us-ascii';
                public static const UTF_8:String = 'utf-8';
                public static const ISO_8859_5:String = 'iso-8859-5';
                public static const KOI8_R:String = 'koi8-r';
                public static const WINDOWS_1251:String = 'windows-1251';
               
                private var ur:URLRequest;
                private var ul:URLLoader;
                private var ba:ByteArray;
                private var xml:XML;
                private var encodedString:String;
               
                public function XMLSender()
                {
                        super();
                        ul = new URLLoader();
                        ul.dataFormat = URLLoaderDataFormat.BINARY;
                        ul.addEventListener(Event.COMPLETE, handleComplete);
                        ul.addEventListener(IOErrorEvent.IO_ERROR, handleIOError);
                        ul.addEventListener(SecurityErrorEvent.SECURITY_ERROR, handleSecurityError);
                }
                public function sendXML(source:Object, url:String, encoding:String = UTF_8, endian:String = Endian.LITTLE_ENDIAN):void
                {
                        try
                        {
                                xml = new XML(source);
                        } catch (e:Error) {
                                trace('unable to convert to XML');
                        }
                        encodedString = xml.toXMLString();
                        ur = new URLRequest(url);
                        var h:URLRequestHeader = new URLRequestHeader('Content-Type', 'application/octet-stream');
                        ur.method = URLRequestMethod.POST;
                        ur.requestHeaders.push(h);
                        ba = new ByteArray();
                        ba.endian = endian;
                        trace(encodedString);
                        ba.writeUTFBytes(encoding);
                        ba.position = 20;
                        ba.writeMultiByte(encodedString, encoding);
                        ba.position = 0;
                        ur.data = ba;
                        ul.load(ur);
                }
                public function handleComplete(evt:Event):void
                {
                        trace('complete', ul.data);
                }
                public function handleIOError(evt:Event):void
                {
                        trace('IO', evt);
                }
                public function handleSecurityError(evt:Event):void
                {
                        trace('security', evt);
                }
        }
       
}

Код:

<?php
mb_internal_encoding("UTF-8");
mb_regex_encoding("UTF-8");
mb_http_output("UTF-8");
ob_start("mb_output_handler");
require_once("includes/receiver.inc");
$rec = new Receiver();
$bom = "\xEF\xBB\xBF";
print $bom . $rec->toString();
?>

Код:

<?php
class Receiver extends DOMDocument {
        public static $US_ASCII = "us-ascii";
        public static $US_ASCII_PHP = "cp1252";
       
        public static $UTF_8 = "utf-8";
        public static $UTF_8_PHP = "UTF-8";
       
        public static $ISO_8859_5 = "iso-8859-5";
        public static $ISO_8859_5_PHP = "ISO-8859-5";
       
        public static $KOI8_R = "koi8-r";
        public static $KOI8_R_PHP = "KOI8-R";
       
        public static $WINDOWS_1251 = "windows-1251";
        public static $WINDOWS_1251_PHP = "Windows-1251";
       
        public $src;
        public $enc;
       
        function __construct() {
                parent::__construct("1.0", "utf-8");
                if(isset($GLOBALS["HTTP_RAW_POST_DATA"])){
                        $ienc = mb_substr($GLOBALS["HTTP_RAW_POST_DATA"], 0 , 20, Receiver::$UTF_8_PHP);
                        $ienc = trim($ienc);
                        switch($ienc) {
                                case Receiver::$UTF_8:
                                        $this->enc = Receiver::$UTF_8_PHP;
                                        break;
                                case Receiver::$US_ASCII:
                                        $this->enc = Receiver::$US_ASCII_PHP;
                                        break;
                                case Receiver::$ISO_8859_5:
                                        $this->enc = Receiver::$ISO_8859_5_PHP;
                                case Receiver::$KOI8_R:
                                        break;
                                case Receiver::$WINDOWS_1251:
                                        $this->enc = Receiver::$WINDOWS_1251_PHP;
                                        break;
                                default:
                                        exit("unrecognised encoding " . $ienc);
                        }
                        $lnt = mb_strlen($GLOBALS["HTTP_RAW_POST_DATA"], $ienc) - 20;
                        $this->src = mb_substr($GLOBALS["HTTP_RAW_POST_DATA"], 20, $lnt, $this->enc);
                        $this->src = iconv($this->enc, Receiver::$UTF_8_PHP, $this->src);
                        $sxml = simplexml_load_string($this->src);
                        $dxml = $this->importNode(dom_import_simplexml($sxml), true);
                        $this->appendChild($dxml);
                } else {
                        $nodata = $this->appendChild($this->createElement("noData"));
                        $nodata->appendChild($this->createTextNode("No data posted!"));
                }
        }
        /**
        * @return string
        */
        function toString() {
            return $this->saveXML();
        }
}
?>

Есси честно, то, возможно можно как-то по-проще... но, застрелите меня, я не знаю как...

ЗЫ. Еще одно полезное применение: можно из этой штуки сделать трейсер для ФД, например, для того, чтобы корректно выводил русские тексты (для тех, у кого вторя дефолтная раскладка клавиатуры не русская).
Т.е. то, что нужно вывести в трейс отсылаем ПХП скрипту, он это конвертит / логирует, и возвращает в другой кодировке. Так что можно будет и в ФД трейс посмотреть, и потом почитать, если что =)

Ноябрь 16.07.2008 05:36

если перекодировать, то зачем хмл.
закачиваем (считай уже байтмассив) и сходу конвертируем в текст в правильной кодировке.

wvxvw 16.07.2008 09:39

Ну так вопрос был про то, как послать ХМЛ, а не текст =)


Часовой пояс GMT +4, время: 10:03.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.