読者です 読者をやめる 読者になる 読者になる

がりらぼ

WindowsRuntimeの応援ブログ

WinRTでマルチバイト文字に対応する

前回とびうお問題に対応したとき、StringInfoクラスのSubStringByTextElementsメソッドを使って文字列抽出したのですがなんとWinRTではSubStringByTextElementsが廃止されてました。
WPF4.5では生きてるのになんでやねん...

ということでもうめんどくさいのでマルチバイト文字に対応するときに必要そうなLengthInTextElementも一緒に拡張拡張ゥ!!!

    public static class StringExtentions
    {
        public static int LengthInTextElements(this string str){
            return (new StringInfo(str)).LengthInTextElements;
        }

        public static string SubStringByTextElements(this string str,int startIndex,int length)
        {
            string resultStr = "";
            for (int i = startIndex; i <startIndex+length; i++)
            {
                resultStr += StringInfo.GetNextTextElement(str,i);
            }
            return resultStr;
        }
    }

SubStringByTextElementsに至っては自力数え上げなのでもうちょっといい計算方法あるかも...
現時点での精一杯です。

使い方は拡張メソッドなのでふつうに名前空間追加したらStringのインスタンスに現れます。

 string tobiuo = "俺が𩹉だ";
            StringInfo info = new StringInfo(tobiuo);
            
            Debug.WriteLine("SrtingInfoから見た文字数"+tobiuo.LengthInTextElements());
            Debug.WriteLine("StringInfoとびうお抽出=" +tobiuo.SubStringByTextElements(2,1));
SrtingInfoから見た文字数4
StringInfoとびうお抽出=𩹉


オッケ