ExtendScript用のサロゲートペア パーサー

残念なことにまたもや月曜日が来てしまいました。しかも寒いじゃないですか(^-^;
皆様におかれましては、お風邪など召されませぬよう充分ご留意いただきまして、この慌ただしい時節を無事乗り越えて頂きたく存じます。はい。冷え込みが厳しくなってきておりますので体調管理は十全にという事でお願いします。
なにも書くことが無いのならさっさと本題に入れって思うでしょうが、これはお約束ですからあきらめてお読みください。
ところで、皆さん憶えていますか? わたし、スクリプトをちょっと書けるんですよ???
という事なので久しぶりに小物を投入しておきます。


ExtendScriptってECMA3の拡張ですから、すごく古いJavaScriptの実装形態となっています。で、コアの部分っていうのが様々な環境変化にも影響されずに古いままなんですね。アプリケーションのDOMはともかく、ArrayやString周りぐらい手を入れても罰は当たらんやろって思うんですがECMA3のままなんです。
さて、このあたりが古臭いとどういった弊害が生じるかというと、文字コードの一部領域において正しく抜き出すことが出来ないという、そこそこクリティカルな問題は出てきます。
一番問題なのがサロゲートペアの問題です。

サロゲートペアについてはテキトーにググってくださいなのですが、この領域を一文字と認識してくれないのがExtendScriptの一番ダメな部分です。InDesign、Photoshop及びIllustratorも絵文字が使えるようになったのですからこの部分の文字コードも正常に取り出してほしいものです。しかしながら、そんなこと言ったところで是正してくれませんので、わたしの方で取り出せるように関数を書いておきました。

alert(decodeSurrogatePair(app.selection[0].contents))

function decodeSurrogatePair(pairStr)
{
if (pairStr.length ==1) return [pairStr.charCodeAt(0).toString(16)];
var uni = [(0x10000 + (pairStr.charCodeAt(0) - 0xD800) * 0x400 
+ (pairStr.charCodeAt(1) - 0xDC00)).toString(16)];
if (pairStr.length ==2) return uni;
uni.push((0x10000 + (pairStr.charCodeAt(2) - 0xD800) * 0x400 
+ (pairStr.charCodeAt(3) - 0xDC00)).toString(16));
return uni;
}

サロゲートペアの見分け方はU+D800から始まる上位第要符号位置及びそれに続くHigh Private Use Surrogatesの範囲を処理対象とすればよいです。ExtendScriptにおいてサロゲートペアを構成しているcontentsでは上位と下位が分離されて2文字と認識されます。このペアを関数に引き渡すと正しいUnicode値が返されます。当該サロゲートペアが絵文字モディファイヤ―がふかされているなどの場合は2つの文字コードが必要になるため1文字分の場合でもこの関数は配列を返します。

コメントを残す

メールアドレスが公開されることはありません。