かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

4バイト文字の長さ

Vistaで追加された4バイト文字「飛魚」(←これが一文字になる)
XPで見てる人もいると思うので、とりあえず出しません。

こいつらが結構厄介なんですよ。とりあえず↓のコードを見てください。
C#

Java

<追記>
うは!JavaとC#で出力結果が微妙に違うわ。画像じゃけぇ直すのめんどいけぇ放置!
</追記>

これを実行すると↓になります。

トビウオの文字数は2文字です

4バイト文字は2文字としてカウントしてくれます。
結構嫌だなぁ…
たとえば入力文字数制限とか…
文字数を奇数で制限してるとゴミだけ入ったりしそうな予感。

ということで、正しい文字数を得るためにはこうするみたいです。
C#

Java

実行すると今度は期待通り!!!

トビウオの文字数は1です

ということで4バイト文字の正しい文字数を求める方法をまとめると。
C#
System.Globalization.StringInfoのLengthInTextElementsプロパティを使用する
Java
StringのcodePointCount(int beginIndex, int endIndex)メソッドを使用する

めんどくさいっす!!!
効率うんぬんを気にしなければ、C#3.0の場合は↓みたいな拡張メソッドを用意しておいて

static class StringExtensions
{
    public static int LengthInTextElements(this string str)
    {
        // 毎回作るのって効率悪いかなぁ…
        return new StringInfo(str).LengthInTextElements;
    }
}

↓みたいに使えるようにしとくと楽かも

string str = "4バイト文字だお";
Console.WriteLine(str.LengthInTextElements());

よく書くコードだから、簡単に書けるようなのをあらかじめ用意しておいて欲しいですね…。
知らないだけであるのかな???