VB.NETで文字列から絵文字除去のコードを作ったが妥協点ができてしまった

VB.NETで、String型の変数の中にある絵文字を除去するプログラムを作りたかったが、かなり妥協してしまった。
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水準の漢字が含まれる場合は、本当にしっかり除去されてしまいます。

判断しようとしている文字が、絵文字であるかの明確な判定ができる方法がないので、本当悩むものです。
やるとしたら、絵文字のコード範囲を全部抑えるとかでしょうか!?


使用言語

Visual Studio 2022 Visual Basic
タイトルとURLをコピーしました