【问题标题】:How to seach emoji with proper text via Entity Framework Core如何通过 Entity Framework Core 搜索带有正确文本的表情符号
【发布时间】:2021-11-11 18:59:50
【问题描述】:

这是我的代码:

var emoji = "⭐";
var query = myContext.Products.Where(x => x.Name.Contains(emoji));

var queryString = query.ToQueryString();
var list = query.ToList();

查询返回所有表记录。如果我将 contains 替换为 equal 效果很好,但我必须搜索这样的内容:

"this is my emoji ⭐"

这是 SQL 查询:

 DECLARE @__emoji_0 nvarchar(4000) = N'⭐'

 SELECT [p].[Id], [p].[Name], [p].[Quantity] 
 FROM [Products] AS [p]
 WHERE (@__emoji_0 LIKE N'') OR (CHARINDEX(@__emoji_0, [p].[Name]) > 0)

在 EF Core 或原始 SQL 中有什么方法可以做到这一点?

【问题讨论】:

  • 这是您要寻找的特定角色吗? “白色中星”U+2B50 本身不是表情符号字符,因为它位于基本多语言平面中,因此应该使用 N'⭐'nchar(11088) 匹配。

标签: sql-server asp.net-core entity-framework-core


【解决方案1】:

您的主要问题是表情符号和字符串的表示方式不同。

在搜索表情符号之前,您需要决定如何在搜索查询和数据库中统一它们。

首先,表情符号是一对字符。这是什么意思?这里引用Microsoft docs

"?".Length = 2
s[0] = '�' ('\ud83d')
s[1] = '�' ('\udc02')

这些例子表明,string.Length 的值表示 char 实例的数量,不一定表示显示的字符数。单个 char 实例本身并不一定代表一个字符。

映射到单个字符的字符对称为代理对。要了解它们的工作原理,您需要了解 Unicode 和 UTF-16 编码。

考虑到这一点,我会这样做:

  1. 定义一个将表情符号转换为 UTF16 字符串 [] 的方法,该方法将保留两个代理字符表示。

    internal static string[] EmojiToUtf16Pair(string emoji)
    {
        string[] arr = new string[2];
        for (int i = 0; i < emoji.Length; i++)
        {
            arr[i] = emoji[i].ToString();
        }
    
        return arr;
    
    }
    

当您在数据库中保留表情符号时,可以使用此功能。根据您决定将表情符号保存在 DB 中的方式,可以对该方法进行一些修改,例如返回连接的字符串或类似的东西。

  1. 我不确定何时,但由于某种原因,您可以使用另一种方法进行反向操作 -> UTF16 to Emoji

     internal static string UTF16PairToEmoji(string[] codes)
     {
         var test = string.Empty;
         foreach (var i in codes)
         {
             test += i;
         }
    
         var result = test.ToString();
    
         return result;
     }
    

所有代码示例如下:

class Program
{
    static void Main()
    {

        var str = "?";
        var utf16 = string.Join("",EmojiToUtf16Pair(str));

        Console.WriteLine(utf16);

        var testEmpoji = UTF16PairToEmoji(EmojiToUtf16Pair(str));

        Console.WriteLine(testEmpoji);
    }


    internal static string[] EmojiToUtf16Pair(string emoji)
    {
        string[] arr = new string[2];
        for (int i = 0; i < emoji.Length; i++)
        {
            arr[i] = emoji[i].ToString();
        }

        return arr;

    }

    internal static string UTF16PairToEmoji(string[] codes)
    {
        var test = string.Empty;
        foreach (var i in codes)
        {
            test += i;
        }

        var result = test.ToString();

        return result;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 2019-03-11
    • 2018-01-07
    • 2023-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多