Форум 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)

Leonik 07.07.2008 12:19

отправка и кодировка XML и повторное нажатие кнопки (2 вопроса)
 
Сделал мини игру, построена она на фреймах (режимы игры) т.е. начальная трсаница, играющая и т.д.

1. Трабла, делаю кнопку "СТАРТ" он переходит на 2 фрейм из 1 (gotoAndPlay(2)) а при после нажатии кнопки "На начало" он переходит на начальную страницу обратно не кнопка "СТАРТ" никак не реагирует

2. Трабла при посылке данных в XML на сервер (PHP) получаю их в через $GLOBALS['HTTP_RAW_POST_DATA'] но понять не могу как там выдёргивать кирилицу, пробовал через encodeURL() во флеше и decodeurl в php -> не канает, кароче ночь убил на эти кодировки

буду благодарен за любую помощь (если есть ссылки на примеры, скиньте плиз), поиск не помог

wvxvw 07.07.2008 12:25

А нельзя ПХП сразу в UTF-8 сохранить? Если нельзя по каким-то другим соображениям - пользуем iconv

me2 07.07.2008 15:31

в php нужно указать заголовок контента:
Цитата:

header('content-type: text/xml; charset: utf-8');
флеш отсылает utf-8. для конвертации кодировок лучше использовать multibyte string
"выдёргивать" кирилицу - это я не понял

wvxvw 07.07.2008 21:17

me2:
В ПХП не посылать, а принимать надо...

me2 08.07.2008 13:25

Гы.
в пхп ПОСЫЛАЮТ.
пхп ПРИНИМАЕТ, чтоб принять utf8 нужно указать на это заголовком. азы ёпта.

в любом случае - цеплятся к словам не прочитав их хотяб дважды, не красиво. Особенно если цепляться не к чему :away:

BlooDHounD 08.07.2008 18:58

me2, да плевать флэшу на ваши заголовки :) ему важно в чём реально записано, а не в чём Вы хотите его убедить :)

Ноябрь 08.07.2008 20:26

me2
заголовки в хтмл страницах.
Флэш работает в ютф.
пхп сохраняем в ютф
к mysql подключаемся с set names utf
в заголовках страницы пишем utf
и нах не работаем в других кодировках.

wvxvw 08.07.2008 20:47

Цитата:

Сообщение от me2 (Сообщение 750806)
Гы.
в пхп ПОСЫЛАЮТ.
пхп ПРИНИМАЕТ, чтоб принять utf8 нужно указать на это заголовком. азы ёпта.

в любом случае - цеплятся к словам не прочитав их хотяб дважды, не красиво. Особенно если цепляться не к чему :away:

сам понял, что сказал? Где ты видел во Флеш функцию header()?

Leonik 09.07.2008 11:57

php не правильно принимает... юзал у флеша

rquest.requestHeaders.push( new RequestHeader( "charset = utf-8" ) ); точно уже не помню как имеено...
но я так и не смог заставить flash отправлять данные серверу в кодировке UTF-8, он юзает ISO- тоже уже точно не помню... всё на работе :(

ну а принимает же FLASH всё нормально (в php всё делаю в UTF-8 и flash всё видит замечательно)

кароче трабла такая что надо из ISO- там какой то... преобразовать в win 1251 (cp1251)...

пытался iconv('ISO----','cp1251',$text);

и так ещё
iconv('ISO----','utf-8',$text);
iconv('utf-8','cp1251',$text);

никакого результата :(

wvxvw 09.07.2008 12:18

Вложений: 1
И естесственно не будет, вам нужно в ПХП работать с UTF-8, а не пытаться кириличный текст сконвертировать в cp1252. Эта кодировка не поддерживает кирилицу, как и другие нестандартные ASCII наборы (смотри сообщение об ошибке на картинке). Да, и флеш посылает UTF-8, а не ISO, если конечно, useCodepage не трогали.

http://en.wikipedia.org/wiki/Windows-1252
таблица символов для cp1252

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, время: 16:29.

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