Долготерпеливый лучше храброго, и владеющий собою лучше завоевателя города. (Царь Соломон)
Задача: есть два чат клиента. Первый реализован на Action Script 2, второй на Action Script 3. Каждый посылает на сервер сообщение в виде escaped строки. В каждом клиенте значение useCodePage установлено в true:
System.useCodePage = true;
Но в среде Flex 3 (Action Script 3.0) кодировка CP1252 принимается за родную. Тогда как Flash IDE (AS 2.0) берет CP1251 в качестве базовой, что влияет на результат одного и того же действия:
// Action Script 3.0
System.useCodePage = true;
var str:String = "Строка";
trace(escape(str)); //%u0421%u0442%u0440%u043E%u043A%u0430
// Action Script 2.0
System.useCodepage = true;
var str:String = "Строка";
trace(escape(str)); //%D1%F2%F0%EE%EA%E0
Потом происходит обмен, и функция unescape() в результате показывает совсем не то, что нужно.
Ограничение: модифицировать возможно только Action Script 3.0 клиент.
Решение: воспользоваться byteArray.
// Action Script 3.0
private function convertIncomingMessage($data:String):String {
var b:ByteArray = new ByteArray();
for ( var i:uint = 0; i<$data.length; i++ ) {
b[i] = $data.charCodeAt(i);
}
b.position = 0;
return b.readMultiByte( b.bytesAvailable, 'windows-1251' );
}
private function convertOutgoingMessage($data:String):String {
var b:ByteArray = new ByteArray();
b.writeMultiByte($data, "windows-1251");
return b.toString();
}
После чего полученную строку успешно преобразовываем либо в читаемый текст, либо в "нужную" escape-последовательность.
feedcat.net promotes your content, measures audiences
and reduces the load on your server resources!