かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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());

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