WebSurfer's Home

トップ > Blog 1   |   Login
Filter by APML

絵文字の入力制限

by WebSurfer 19. October 2010 21:02

MSDN フォーラムで、名前などの入力項目に携帯の絵文字を入力させないように、以下のステップで対応したいという話がありました。

  1. ユーザーのキャリアを判定
  2. キャリア別に入力の絵文字をチェック
  3. 絵文字が含まれていればエラー表示

フォーラムでは、このうち 2 番目のステップについて議論があり、自分が提案した方法でうまくいったそうですので、その内容を書いておきます。

ASP.NET の Web アプリのサーバー側のプログラムでは文字列は Unicode で扱われるので、絵文字に該当する Unicode 文字が分かれば、正規表現を使ってチェックできるはずです。

Wikipedia のページ 携帯電話の絵文字 によると、各キャリアの絵文字の Unicode 表現は以下のとおりとのことです。

  • au: E468-E5DF, EA80-EB88
  • DoCoMo: E63E-E6A5, E6AC-E6AE, E6B1-E6BA, E6CE-E757
  • SoftBank: E001-E05A, E101-E15A, E201-E253, E301-E34D, E401-E44C, E501-E537
  • emobile: E63E-E6A5, E6AC-E6AE, E6B1-E6BA, E6CE-E757, E600-E619

ユーザーが TextBox などに入力して POST した文字列をサーバー側で取得したとき、絵文字は上記の Unicode 文字になるはずです。

キャリア別に処置する必要がなければ、ちょっと乱暴かもしれませんが、外字全部(U+E000〜U+F8FF)を対象としてもいいかもしれません。

i絵文字

i-mode 絵文字入りの Shift_JIS コードを String 型の文字列 (Unicode) に変換し、正規表現を使って絵文字の有無のチェックおよび除去するサンプルを、C# のコンソールアプリで作って検証してみました。

ドコモが提供している絵文字入力ソフト「i絵文字」で、テキストファイルに簡単に i-mode 絵文字を挿入して試験できるのでお試しください。

全部の i-mode 絵文字を試したわけではありませんが、自分が試した限りでは i-mode 絵文字の有無のチェックおよび除去は以下のサンプルで可能でした。

au, Softbank, emobile も、上に紹介した「携帯電話の絵文字」のページの Unicode で pattern を作れば、チェックや除去は可能だと思います。

なお、ドコモ以外は検証していませんし、保証はできませんので、参考にするならご自分で十分検証してくださいね。

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;

namespace EmojiCheck
{
  class Program
  {
    static void Main(string[] args)
    {
      // testfile.txt は試験用の Shift_JIS のテキストファイル。

      string path = "testfile.txt";

      if (File.Exists(path))
      {
        string text = string.Empty;

        using (FileStream fs = File.Open(path, FileMode.Open))
        {
          byte[] b = new byte[(int)fs.Length];
          Encoding enc = Encoding.GetEncoding("shift_jis");
          fs.Read(b, 0, b.Length);
          text = enc.GetString(b);
        }

        Console.WriteLine(text);
        Console.WriteLine("----------------------------");

        // i-mode 絵文字の Unicode 表現
        string pattern = 
          @"[\uE63E-\uE6A5]|[\uE6AC-\uE6AE]|[\uE6B1-\uE6BA]|[\uE6CE-\uE757]";
        if (Regex.IsMatch(text, pattern))
        {
          Console.WriteLine("i-mode 絵文字があります。");
        }
        else
        {
          Console.WriteLine("i-mode 絵文字はありません。");
        }
        Console.WriteLine("----------------------------");

        // 絵文字を除去した文字列を取得
        Regex rgx = new Regex(pattern);
        string outputStr = rgx.Replace(text, "");
        Console.WriteLine(outputStr);
      }
    }
  }
}

Tags:

ASP.NET

About this blog

2010年5月にこのブログを立ち上げました。その後 ブログ2 を追加し、ここは ASP.NET 関係のトピックス、ブログ2はそれ以外のトピックスに分けました。

Calendar

<<  July 2021  >>
MoTuWeThFrSaSu
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

View posts in large calendar