[C#][Web]Unicode絵文字とキャリア絵文字そしてSystem.Globarization.StringInfo.GetTextElementEnumeratorメソッド

今更感漂うのですが8月のこみゅぷらす勉強会で話した時に使った資料をブログで公開するの忘れていたので公開しておきます。

Unicode絵文字とキャリア絵文字について+で、実際に相互変換はどうしているのかというあたりをザックリと書いてあります。
C#タグがついているのは相互変換をやるのにC#を使っているからです。

[iframe src=”http://www.slideshare.net/slideshow/embed_code/24674603″ width=”427″ height=”356″ frameborder=”0″ marginwidth=”0″ marginheight=”0″ scrolling=”no” style=”border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px” allowfullscreen] [/iframe]

結論としては

・この中で使っているStringInfoクラスを使うと、サロゲートペアなども1文字としてカウントして排出してくれるので便利ですねーという話
・結局もっとも融通の聞かないキャリアの絵文字に引きずられるので早くUnicode絵文字だけになってほしいという話

最後に簡単にStringInfoクラスのGetTextElementEnumeratorメソッド便利という一例をサンプルコードでいかに示します。

例によって、Chaining Assertion for MSTestを利用しています。

            //合字を表現する2文字分のUTF32文字コードを表現したバイト列からstring型にする
            var value = System.Text.Encoding.UTF32.GetString(new byte[] { 0x23, 0x00, 0x00, 0x00, 0xE3, 0x20, 0x00, 0x00 });

            //もちろん長さは2文字
            value.Length.Is(2);

            //しかし、System.Globarization.StringInfoクラスのGetTextElementEnumeratorメソッドに食わせると・・・
            var enumerator =  StringInfo.GetTextElementEnumerator(value);

            var list = new List<string>();

            while (enumerator.MoveNext())
            {
                //合字を一つの単位として表現するためstring型
                list.Add(enumerator.Current as string );
            }

            //結果、ちゃんと一つの単位として出力されるので、サロゲートペアや、合字で表現されるような一部のUnicode絵文字の処理などに利用している
            list.Count.Is(1);                

追記:docomoさんも、スマートフォンの絵文字の相互運用で悩むくらいならせめてスマートフォンはキャリア絵文字捨てませんかね #ガラケーという遺産が・・・

Share