Flexでターミナルのマルチバイトの件
入力(Telnet) --> デコーダバッファ --(十分=1文字分データが溜まったら) --> 文字を出力
という流れで。ただし、デコーダバッファにデータを入れるとき、デコーダバッファが空 && 入力が127以下なら、シングルバイト文字として扱う。逆にデータバッファが空 && 入力が128以上なら、マルチバイト文字と判断して、2バイト以上データが溜まらないとデコードを行わないようにする。
これでちょっと試してみたところ、UTF-8、EUC-JP、Shift_JIS、EBCDIC-JapaneseAndKanaが通ることが分かった。EBCDICはネタ。ISO2022-JPは勘弁。
一方でUTF-16とUTF-32は通らない。UTF-32はFlexがそもそも対応していないのでしょうがない。UTF-16は、サロゲートペアを無視するなら、入力が127以下ならシングルバイトとして扱うコードを外せば通ると思う。だけどサロゲートペアがあるのでー…UTF-16はどうせ使わないかなーと。
ところでActionScriptのStringクラスで、charCodeAt()メソッドの返り値が16ビットの整数らしいのだけど、これはUTF-16ということかな? ActionScriptに「文字型」が無いので、代わりに整数型を文字型の代用にしようと思ったのだけど、サロゲートペアをこっちで処理しないといけないのは面倒。サロゲートペアなんて無視だーという考えもアリ?でもまぁ素直にStringを使っておくことにする。