上で.NETではUTF-16(.NET Frameworkの標準となるUNICODE文字のエンコード)でBMP領域以外では正確な文字数がとれないみたいなことが書かれていたが、数え方が悪いだけだ。APS.NETの本まで出して何をやっているの。。
弾氏がブログで取り上げたJSの標準関数以外でソロゲートペアに対応した標準関数,ライブライなんてあんまり見たことがない。ま、作らないと行けないってことです。
以下は、私がgistに公開しているサロゲートペアを含む文字列が半角相当何文字になるか調べるサンプル。(SIerっぽいだろう)
この中のTestCharWithSurrogatePair関数で、サロゲートペアを考慮したstringの文字数を調べていている。string型のまま一発で調べる方法なんて無いので、一度char型の配列に分解下後に、char型のstaticメソッドのIsSurrogateを使って、その文字がサロゲートペアの最初の文字か確認して、そうであれば次の文字がもう一つの文字でペアになっているのでchar型二つで1文字とカウントするようにしている。
普通にBCLだけで出来ますね。SIer的にも安心って感じですよ。
これで、UNICODE 6.0にも対応させた文字カウントが出来るのだけど、このままではIVSに対応していない。Windows 7 / 8、IE10以上対応をするには、これにプラスしてIVS対応が必要だ。
と言うことで、気が向いたらそのうちIVSがらみの記事でも書きます。
追記。
ついカッとなって書いたので、元記事の読み込みが正確で無かったです。陳謝してお詫びします。
StringInfo.LengthInTextElementsを使っている例がちゃんとありました。ただ文字数だけ調べたいならこっちの方が便利でしたね。
コメント
RT @ishisaka: .NET FramewrorkでBMP以外のUnicode文字にも対応した文字数の数え方: … http://t.co/1qc8psC2ej
元記事の読み込みが足らなくてスマン買ったです。。
ちなみに、どなたかLengthInTextElementsがIVS含めて文字数返してくれるのかくれないのか知っている方がおられたら教えて下さい