プレイヤー名やモンスターのニックネームなど文字数の制限を行いたい場合に、全角は2、半角は1として合計30まで、といった数え方で文字数を制限したいケースの実装方法です。
よくある内容ですが、実際に実装するのはなかなか手順が多く大変でした。
要点
- Shift_JISでByteにエンコードする
- 「I18N.CJK.dll」と「I18N.dll」をプロジェクトにインポートする
Shift_JISでByteにエンコードする
通常のエンコードといえばUTF8だと思いますが、UTF8だと漢字が3byte、かなが2byteだったりするため、文字数のカウントには向いてません。
そこで、文字数のカウントではShift_JISへのエンコードを行います。
using System.Text;
public static class StringEncodingExtension
{
public static int GetSJISByteCount(this string text)
{
return Encoding.GetEncoding("Shift_JIS").GetByteCount(text);
}
}
拡張メソッドで書いておけば、適当な場所でstringのbyte文字数を数えられます。
using UnityEngine;
public class StringEncodingExtension
{
public void Start()
{
string nickName = "キラーマシン2";
// >>> 13
Debug.Lot(nickName.GetSJISByteCount());
}
}
「I18N.CJK.dll」と「I18N.dll」をプロジェクトにインポートする
Unityエディタならコード書くだけで済みますが、実は実機でやろうとするとShift_JISエンコードがサポート対象外となってエラーになってしまいます。
対応策として、「I18N.CJK.dll」と「I18N.dll」をプロジェクトにインポートさせてあげると上手くいきました。
参考
感想
完全にぼやきですが、なんで文字数数えたいだけなのにこんな苦労しなきゃならないんだ...? って思いました。