前提・実現したいこと
文字列に様々な絵文字(⚡、☔などの)が含まれている場合、その絵文字を削除したいです。
該当のソースコード
文字を削除する関数は以下のサイトを引用しましたが、文字列内に絵文字が含まれている条件をどのように判定したら良いか教えてください。
(ちなみに文字コードはutf-8で全角文字を2バイトとなります。)
http://f4.aaacafe.ne.jp/~pointc/log217.html
以下は途中まで作ったコードになります
/* mojiの文字列内にdelという文字が含まれている場合に削除する */ char *deleteMoji(char *moji, const char *del) { char *p1 = moji; char *p2; int len = strlen(del); char strConcat[100] = ""; while((p2 = strstr(p1,del)) != NULL) { strncat(strConcat,p1,p2 - p1); p1 = p2 + len; } strcpy(moji, strcat(strConcat,p1)); return moji; } int main(void){ char moji[100] = "abc⚓123☔あいう☀"; int i; for(i=0; i<strlen(moji); i++){ if((moji[i]+moji[i+1])が絵文字の場合){ char del[3]; // 絵文字は全角文字のため2バイト分のcharを結合する? sprintf(del, "%c%c", moji[i], moji[i+1]); deleteMoji(moji, del); } } // mojiはabc123あいうとなるようにしたい }
以上、よろしくお願いいたします。
utf-8 では通常の全角文字は 3 バイトです。絵文字はたしか 3 〜 4 バイトですね。
漢字にも4バイトになる文字がありますよ
まず、「絵文字」というのがUnicodeにおいて何にあたるのかを明確に定義する必要があります。
最も単純なのはUnciodeのBlockで判断する方法です。どのBlockが絵文字になるのかを定めてください。
https://www.compart.com/en/unicode/block
そうではなく、ScriptやCategory等で判断となるとやや難しくなります。なぜなら、単純な数値の計算では判断できず、リストを持つ必要があるからです。