Показать сообщение отдельно
Старый 12.07.2008, 01:03
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 14  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Вот, двое суток не ел и не спал, практически =)))
Собственно, что это все делает:
Позволяет во флешке закодировать ХМЛ в одну из быбраных кодировок, отослать ПХП и в ПХП мы можем узнать в какой кодировке к нам пришла строка и по желанию конвертнуть ее во что-то другое. Немного бесцельное занятие, т.как я бы просто все делал в УТФ-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();
	}
}
?>
Есси честно, то, возможно можно как-то по-проще... но, застрелите меня, я не знаю как...

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


Последний раз редактировалось wvxvw; 12.07.2008 в 01:09.