ByteArray に 'unicodeFFFE' を書き込む際のバグ

10/05/10 追記 10/05/10 現在の最新 version FlashPlayer 10.0.45.2 でのバグで、10.1 RC4 では FIX されています。

ByteArray.writeMultiByte() メソッドには 2 バイト文字の 処理に不具合があります。 utf-16 BE (BigEndian) を書き込んだ際の諸環境で起こるバグの症状の確認の為の サンプルを wonderfl で書いてみました。 また、バグ対応のコードも合わせて確認します。

ByteArray に ‘unicodeFFFE’ を書き込む際のバグ – wonderfl build flash online

Windows FlashPlayer 10.0.45.2 plug-in/activeX

unicodeFFFE を指定したにもかかわらず shif_jis のキャラクタコードで書き込まれます。

Macintosh FlashPlayer 10.0.45.2 plug-in

2 バイト文字のみの間は utf-16 BE のキャラクタコードが正常に書き込まれますが、 1 バイト文字が混在すると以降のキャラクタコードが書き込まれません。

Linux FlashPlayer 10.0.45.2 plug-in

何も書き込まれません。

バグの対処法の解説

unicodeFFFE とは、utf-16 BE (BigEndian) なので String.charCodeAt(index);で一文字ずつですが取得可能です。 utf-16 では 1 文字を 2 バイトもしくは 4 バイトで定義しています。 つまり、文字列を一文字ずつ走査し、 charCodeAt() メソッドでキャラクタコードを取得し、 0×0000 〜 0xFFFF の範囲なら writeShort() メソッドで 2 バイトとして書き込み、 0×00010000 〜 0xFFFFFFFF の範囲なら writeUnsignedInt() メソッドで 4 バイトとして ByteArray に書き込めばよいことになります。
// ただし、日本語の場合は第二水準漢字まで含めても 2 バイト内に収まります。


About this entry