String型に入っている、絵文字をとにかく全部除去したかったのだ。
そして、ひらがなや漢字、数字、英字などは維持をする。
妥協点はあるけど、まあ、このソースでも十分動くことは動くので良いかな。
ソースコードは下に掲載しました。
ソースの妥協点
妥協点としては、以下のような点がある。半角の「ガ」や「パ」等が全角の「ガ」、全角「パ」に置き換わる
文字列内に、半角カタカナ文字で濁点や半濁点がある文字、例えばガやパ等の文字がある場合、全角カタカナの文字になってしまう。第3水準漢字の一部や、第4水準漢字も除去される
第3水準や第4水準の漢字が含まれている場合、それらも文字列から除去されてなくなってしまう。個人的には、第3水準や第4水準の漢字は使わないので、あまり問題を感じていないが、完璧を求める人には使えないソースコードとなる。
絵文字ではない漢字のサロゲートペアも除去される
絵文字のサロゲートペアの種類は非常に多いが、漢字としてのサロゲートペアの漢字も除去されてしまう。しかし、サロゲートペアの漢字の種類を見てみると、普段使うような漢字がまったくないので、個人的にあまり問題を感じていない。
完璧を求める人には、使えないコードとなる。
ソースコードの注意点と使用方法
StrConvの行でエラーになる場合は、★の行のコメントアウトを解除し有効にする。フォーム(Form1)に、button1、label1、TextBox1を貼りつけ、下のソースコードを貼り付ければ、すぐに動くようになっています。
テキストボックスに文字列を入力し、ボタンを押すと、ラベルに除去後の結果が表示されます。
絵文字除去のソースコード
Public Class Form1
'*****************************************************************************************
'絵文字除去【妥協点あり】
'
'妥協点1:半角の「ガ」や「パ」等が全角の「ガ」、全角「パ」に置き換わる
'妥協点2:第3水準漢字の一部や、第4水準漢字も除去される(しかし、そのような漢字は滅多に使われない)
'妥協点3:絵文字ではない、漢字のサロゲートペアも除去される(しかし、そのような漢字は滅多に使われない)
'
'wReceive_String:絵文字を除去したい文字列
'Emoji_Buster()As String:絵文字を除去した文字列が返る
'*****************************************************************************************
Public Function Emoji_Buster(ByVal wReceive_String As String) As String
'===================================================================
'文字が無いなら即抜ける
'===================================================================
If wReceive_String.Trim = "" Then
Emoji_Buster = ""
Exit Function
End If
'===================================================================
'【第1段階】半角濁点バスター起動
'===================================================================
wReceive_String = Hankaku_Dakuten_Buster(wReceive_String) '←半濁点バスター
'===================================================================
'作業用変数
'===================================================================
Dim wResult_Str As String = "" '除去後の結果の文字列
Dim wLp As Integer 'ループで使用する
Dim wMojisuu As Integer = 0 '2バイト絵文字除去で使用するワーク変数
Dim wWork As String '1バイト絵文字除去で使用するワーク変数
Dim w1Moji As String '1バイト絵文字除去で使用するワーク変数
'★StrConvの行でエラーになる場合は、↓この行のコメントアウトを解除し有効にする
'System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance)
'===================================================================
'【第2段階】絵文字除去(サロゲートペアの除去)
'===================================================================
Dim wStr As New System.Globalization.StringInfo(wReceive_String)
For wLp = 0 To wStr.LengthInTextElements - 1
'===============================================================
'1文字抽出して長さを調べる
'===============================================================
If wStr.SubstringByTextElements(wLp, 1).Length < 2 Then
'1だった
wResult_Str = wResult_Str & wReceive_String.Substring(wMojisuu, 1)
wMojisuu = wMojisuu + 1 '1文字プラス
Else
'2だった。この文字は除去するのでリザルト文字に加えない
wMojisuu = wMojisuu + 2 '2文字分プラスする
End If
Next wLp
'===================================================================
'【第3段階】絵文字除去パート2(サロゲートペア以外の絵文字除去)
'===================================================================
wWork = wResult_Str '結果の文字をワークに代入(退避)
wResult_Str = "" '結果の文字を初期化する
'======================================================
'左から1文字ずつ抽出し文字数分ループする
'======================================================
For wLp = 0 To wWork.Length - 1
'==================================================
'1文字抽出
'==================================================
w1Moji = wWork.Substring(wLp, 1)
'==================================================
'抽出した文字が全角?ならそのまま生かす
'==================================================
If w1Moji = "?" Then
'この全角クエスチョンは、元々あった全角クエスチョンなので生かす
wResult_Str = wResult_Str & w1Moji 'もともと文字がクエスチョンだったので、結果に1文字追加する
Else
'抽出した1文字が、全角?以外の時は全てコチラに来る
'==============================================
'1文字を全角化してみる(元々全角だとしてもとにかく強制的に全角化してみる)
'==============================================
w1Moji = StrConv(w1Moji, Microsoft.VisualBasic.VbStrConv.Wide)
'==============================================
'StrConvで全角?が返ってくるものは、
'絵文字か常用では絶対使わない超マニアック漢字(第3水準漢字の一部と第4水準のほとんど全部)なので、
'これをもって絵文字バスターとする
'===============================================
If w1Moji <> "?" Then
wResult_Str = wResult_Str & wWork.Substring(wLp, 1) '普通の文字だったので結果に1文字追加する
End If
End If
Next wLp
'===================================================================
'結果を返す
'===================================================================
Emoji_Buster = wResult_Str
End Function
'**************************************************************************************
'半角濁点バスター
'**************************************************************************************
Private Function Hankaku_Dakuten_Buster(wStr As String) As String
wStr = wStr.Replace("ガ", "ガ")
wStr = wStr.Replace("ギ", "ギ")
wStr = wStr.Replace("グ", "グ")
wStr = wStr.Replace("ゲ", "ゲ")
wStr = wStr.Replace("ゴ", "ゴ")
wStr = wStr.Replace("ザ", "ザ")
wStr = wStr.Replace("ジ", "ジ")
wStr = wStr.Replace("ズ", "ズ")
wStr = wStr.Replace("ゼ", "ゼ")
wStr = wStr.Replace("ゾ", "ゾ")
wStr = wStr.Replace("ダ", "ダ")
wStr = wStr.Replace("ヂ", "ヂ")
wStr = wStr.Replace("ヅ", "ヅ")
wStr = wStr.Replace("デ", "デ")
wStr = wStr.Replace("ド", "ド")
wStr = wStr.Replace("バ", "バ")
wStr = wStr.Replace("ビ", "ビ")
wStr = wStr.Replace("ブ", "ブ")
wStr = wStr.Replace("ベ", "ベ")
wStr = wStr.Replace("ボ", "ボ")
wStr = wStr.Replace("パ", "パ")
wStr = wStr.Replace("ピ", "ピ")
wStr = wStr.Replace("プ", "プ")
wStr = wStr.Replace("ペ", "ペ")
wStr = wStr.Replace("ポ", "ポ")
wStr = wStr.Replace("゙", "") '単独半角濁点除去
wStr = wStr.Replace("゚", "") '単独半角半濁点除去
Hankaku_Dakuten_Buster = wStr
End Function
Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click
Label1.Text = Emoji_Buster(TextBox1.Text)
End Sub
End Class
結構しっかり絵文字を除去できている
個人的に、色々な文字列を通してみましたが、エラーで落ちることはなさそう。半角の濁点や半濁点有りのカタカナ文字は、全角になってしまう仕様です。
マニアックな第3や第4水準の漢字が含まれる場合は、本当にしっかり除去されてしまいます。
判断しようとしている文字が、絵文字であるかの明確な判定ができる方法がないので、本当悩むものです。
やるとしたら、絵文字のコード範囲を全部抑えるとかでしょうか!?