2006年07月19日
Flash | AS3 メールヘッダをエンコード
できた!package jp.strippers.mail {
import flash.utils.ByteArray;
import mx.utils.Base64Encoder;
public class MailUtil {
private static const B_ENCODE_PREFIX:String = "=?ISO-2022-JP?B?";
private static const B_ENCODE_SUFIX:String = "?=";
private static const DEFAULT_CHARSET:String = "iso-2022-jp";
public static function encodeHeader(str:String):String {
var sb:String = new String();
var nonAscii:String = new String();
for (var i:uint = 0; i < str.length; i++) {
var charCode:Number = str.charCodeAt(i);
if (0x20 <= charCode && charCode <= 0x7e) {
if (nonAscii.length > 0) {
sb += bEncode(nonAscii);
nonAscii = "";
}
sb += String.fromCharCode(charCode);
} else {
nonAscii += String.fromCharCode(charCode);
}
}
if (nonAscii.length > 0) {
sb += bEncode(nonAscii);
}
return sb;
}
public static function bEncode(str:String):String {
var ba:ByteArray = new ByteArray();
ba.writeMultiByte(str, DEFAULT_CHARSET);
var encoder:Base64Encoder = new Base64Encoder();
encoder.encodeBytes(ba);
return B_ENCODE_PREFIX + encoder.flush() + B_ENCODE_SUFIX
}
}
}ポイントとしては、ドキュメントにないBase64Encoderクラスを使うところと、文字コードの変換にByteArrayクラスを使っているところ。ところで、AS3にはJavaで言うところのStringBufferクラスがないので、Stringをバンバン結合するしかないみたい。corelibのソースに
var sb:String = new String(); というStringBufferを模しているようなコードが含まれていたので、真似してみた。追記: 少なくともbeta2まではStringBufferクラスは存在していた様子。akihiro kamijo: StringBuilder クラス
Comment
確か、Stringの内部処理が変更されて高速に文字列結合が出来るようになったので、StringBufferの存在意義が無くなって削除されたようだった気がします。
Posted by: : 2006年07月25日 18:04