회사에서 utf-8 이외의 xml을 못 읽는다기에 나는 그냥 아무 생각 없이 utf-8 형태의 xml만 줬었는데 Flash용으로 다른 콤포넌트를 만드는 작업에서 utf-8 이외의 xml을 읽어야하는 경우가 생길거 같아서 이제야 좀 찾아봤다.
해답은 가까운 곳에 있었고 또다시 한번 macromedia의 개념없는(?) API들에 놀라움을 금치 못 했다.
어찌됐든, ByteArray 형태로 xml을 가져올 수 있다고 치자. 준비 단계로
[Embed(source="config.xml", mimeType="application/octet-stream")]
private static var ConfigXML:Class;
그리고..
var bytes:ByteArray = new ConfigXML();
혹은
var request:URLRequest = new URLRequest(url);
var variables:URLVariables = new URLVariables();
variables.preventCache = new Date().getTime();
request.method = URLRequestMethod.GET;
request.data = variables;
var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.addEventListener(Event.COMPLETE, onComplete);
onComplete 시
var loader:URLLoader = URLLoader(event.target);
var bytes:ByteArray = loader.data as ByteArray;
ByteArray를 가져온 이후로 다시 encoding에 대한 부가적인 처리가 필요하다.
var xml:String = null;
(1) var matches:Array = bytes.toString().match("encoding=\"(.+)\"");
if (matches && matches.length > 0) {
var encoding:String = matches[1];
(2) if (encoding) {
xml = bytes.readMultiByte(bytes.bytesAvailable, encoding);
}
}
(3) if (!xml) {
xml = bytes.readUTFBytes(bytes.bytesAvailable);
}
var result:XML = new XML(xml);
기본적인 로직은
(1) 일단 깨진 상태로 읽고 거기서 encoding 정보만 가져와서
(2) encoding 정보가 있을 경우는 해당하는 encoding 정보를 이용하고
(3) 없으면 걍 utf-8로 읽으라는 뜻이다.



