質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

4回答

15829閲覧

絵文字の判別方法

venturer_level1

総合スコア15

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2016/11/01 01:41

Unityでチャット機能をC#で実装しようとしており、
その中で入力テキストの絵文字を判定する方法を探しています。

本当は絵文字も扱えるようにしたいのですがなかなか難しそうなので、
絵文字を判別して入力させない様にしたいと思います。

各サイトを参考にさせていただき、入力された文字列を1文字づつ以下のように調べて
絵文字であれば省くようにしました。

string inStr = messageInputField.text; if(inStr.Length != 0) { StringBuilder retStr = new StringBuilder(); System.Globalization.TextElementEnumerator tee = System.Globalization.StringInfo.GetTextElementEnumerator(inStr); tee.Reset(); while(tee.MoveNext()) { // 1文字取得 var te = tee.GetTextElement(); // 1文字が2つ以上のcharからなる場合は、サロゲートペアと判断 if(1 < te.Length) { // 文字列から除去 } else { retStr = Append(te); } } // InputFieldに返す messageInputField.text = retStr.ToString(); }

こちらを実装してiOS,Androidの実機で確認したところ、ある程度の絵文字は判別でき
入力から除外することができましたが、星座のシンボルマークや斜め矢印などの絵文字は
このチェックをすり抜けてしまいます。

絵文字を完全に判別できる方法はないでしょうか?
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

質問者さんのやりかたは、「UTF-16でサロゲートペアになる文字はすべて取り除く」というものですね。これは、ユニコードでの符号位置がU+10000以降の文字はすべて取り除く」というのと同じです (これらの大半は、使用頻度の低い漢字や古代の文字などで、絵文字ではありません。ただ、もともと使わないから広めに取り除いても実害はないというのなら、構わないですが)。いずれにせよ、絵文字と見なされ得る文字はこのコード範囲だけに存在するわけではないです。

どれが絵文字なのかを、文字コードから簡単なルールで知ることはできません。ユニコードコンソーシアムが、Unicode Emoji Resourcesでユニコードに登録された絵文字の情報を公開しています。絵文字として扱われそうなユニコードの文字や、字形の表があります。こういったデータを利用して、取り除く文字を決めることができます。


(15:01のコメントの後で追記)

上記情報源の文字のうち、質問者さんにとって絵文字扱いをしたい文字は、単に羅列すればいいです。コード表で字形を確認して、判断して下さい。しかし、次に説明するように、Emoji Data Fileのemoji-data.txtにあるコードすべてを単純に羅列したのではだめです。

たとえば上のファイルに含まれているU+0023 (番号記号) は、普通の文字として扱いたいでしょう。しかし、異体字セレクタがついてU+0023 U+FE0EやU+0023 U+FE0Fとなったときは絵文字らしく表示されるので、このときは絵文字扱いしたいでしょう (一覧)。また、U+200D (ZWJ) で複数の絵文字をつなぐことで別の絵文字を作れます (一覧)。これらのようなパターンも含める必要があります。

詳しいルールについて興味があれば、UTR#51を見て下さい。

投稿2016/11/01 05:42

編集2016/11/01 08:00
ikedas

総合スコア4333

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

venturer_level1

2016/11/01 06:01

ご回答ありがとうございます。 https://gist.github.com/anon5r/3856941 例えば上記のように、取り除く文字コードすべてを羅列するような形でパターンを指定してチェックするべきでしょうか?
venturer_level1

2016/11/01 10:20

emoji-data.txtを編集してパターンを作成し、先に挙げた絵文字をチェックして除外することができました。 U+0023 U+FE0EやU+0023 U+FE0Fの件も対応してみます。 詳しい補足などありがとうございました。
guest

0

入力された文字列を1文字づつ以下のように調べて
絵文字であれば省くようにしました。

そのコードは絵文字かどうかの判定ではなく、サロゲートペアかどうかの判定です(しかも、あまりスマートな方法ではないですが)。Unicodeの基本多言語面にもたくさんの記号や絵文字が存在するので、文字コードでチェックしないと判別できません。

絵文字を完全に判別できる方法はないでしょうか?

「絵文字」の定義が曖昧なので「完全に」は不可能です。大雑把な文字種分けはUnicodeで規定されているので文字コードの範囲チェックでできますが、例えば「装飾記号(Dingbats)」に割り当てられている文字には明らかな絵文字(✀✋✌✑✿など)に混じって意味のある文字や記号(❮❯❴❵➀➁➂➕➖➗など)などがあり、線引きが難しいです。それを一つ一つ目で見て「これは使う、これは絵文字だから除外」などと分類できるでしょうか。

私としては、「チェックしない」のも一つの手段だと思います。チャットということは入力された文字を処理することになると思いますが、入力できる時点でシステムがサポートしている文字な訳ですから、さらにチェックするのは冗長のような気がします。それに、チャットなどで絵文字を使うことはごく普通になっていますから、「絵文字禁止」にするのはユーザーの満足度の低下につながります。

ただ、プログラムの簡素化のためにサロゲートペアは非対応にするというのは、場合によってはありだと思います。Webサービスでもそのようなサイトはたまに見かけますから。
サロゲートペアは文字コードの範囲指定で判別できるので、除外するだけなら正規表現1行で記述できます。

C#

1// str1の中のサロゲートペアを除外 2string str2 = Regex.Replace(str1, @"[\uD800-\uDFFF]", "");

文字を扱うならUnicodeについての理解を深めることをお勧めします。
https://ja.wikipedia.org/wiki/Unicode

投稿2016/11/01 05:51

catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「絵文字」とは何が対象になりますか?
「・」「♪」「▲」「★」「Ω」「♊」どれが絵文字ですか?
結局のところ簡単な方法はなく、Unicode表で定義されている文字すべてからventurer_level1さんが「絵文字」と認識されているものを全て地道に除外するしかないのでは?

https://ja.wikipedia.org/wiki/Unicode一覧表

投稿2016/11/01 04:53

Y.H.

総合スコア7914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

絵文字を完全に判別できる方法はないでしょうか?

質問者さんの言う「絵文字」の定義(文字コード)は何かというところから話を始めていただかないと答えを出すのが難しいのですが・・・

それさえはっきりすれば正規表現を使って以下のような対処ができるのではないですか?

絵文字の入力制限
http://surferonwww.info/BlogEngine/post/2010/10/19/Removing-Emoji-in-post-from-cellular-phone.aspx

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

ただし、U+E000〜U+F8FF の中に、

星座のシンボルマークや斜め矢印などの絵文字

が含まれているかどうかは分かりませんが・・・

投稿2016/11/01 02:46

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

venturer_level1

2016/11/01 03:19

ご回答ありがとうございます。 ご提示いただいたサイトも確認しておりまして、おっしゃる通りU+E000〜U+F8FFの範囲を対象としてチェックしてみましたが結果が変わらなかったため、おそらくその範囲に入ってないのだと思いました。 別の方法はないでしょうか?
退会済みユーザー

退会済みユーザー

2016/11/01 03:23

対象とする「絵文字」の文字コードが分からないと何とも手の打ちようがないと思います。
venturer_level1

2016/11/01 04:42

以下の文字がチェックをすり抜けてしまった文字コードの一部です。 Ophiuchus : U+26CE Black Up-Pointing Double Triangle : U+23EB Black Down-Pointing Double Triangle : U+23EC これでどうでしょうか?
ikedas

2016/11/01 05:42

SurferOnWwwさんのご回答は、日本の携帯キャリアが用いていた、絵文字をユニコードの私用領域に割り当てるという方式に対応したものです。ただフィーチャーフォンには適用できるものの、iOSやAndroidとは関係がないと思います。
退会済みユーザー

退会済みユーザー

2016/11/01 06:58

その 3 つ以外にも質問者さんが「絵文字」と考える文字が多々あるのではないでしょうか?(以下の URL 参照) Unicode6.0の携帯電話の絵文字の一覧 https://ja.wikipedia.org/wiki/Unicode6.0%E3%81%AE%E6%90%BA%E5%B8%AF%E9%9B%BB%E8%A9%B1%E3%81%AE%E7%B5%B5%E6%96%87%E5%AD%97%E3%81%AE%E4%B8%80%E8%A6%A7 他の回答者の方も言われるようにご自分で何を「絵文字」と定義するか線引きして、それに沿って正規表現のパターンを作るなりして対応すると言うことになるかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問