如何在C#中获取包含表情符号的字符串的正确长度

The*_*heQ 7 .net c#

英语标志,表情图案由14个字节的数据,该组合将呈现一个单个字符的时候- .

If I have code that looks like this:

var test = "\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f";

Console.WriteLine(test);
Console.WriteLine(test.Length);
Run Code Online (Sandbox Code Playgroud)

It will print the character, and the number 14.我想以某种方式回归1.在搜索互联网寻找答案时,我发现了这个解决方案:

var stringInfo = new System.Globalization.StringInfo(test);
Console.WriteLine(stringInfo.LengthInTextElements);
Run Code Online (Sandbox Code Playgroud)

问题是,它反而打印7.我猜它把它解释为双字节unicode,只给我一半的字节长度.有关工作示例,请参阅此dotnetfiddle.

如何获取字符串将表示为的字形数?

这是一个用Swift编写的类似测试,在OSX上的XCode中运行,它显然正如我想要的那样工作,但我需要它在C#中.

斯威夫特操场

小智 3

您可以在此处阅读文档:https://docs.google.com/document/d/1pC7N32TnmDr2xzFW4HscA1DyAPPZnwILUH2_03UL6Jo/preview

基于此,这里有一些似乎有效的方法:
安装 NuGet 包:

并尝试以下代码:

class Program
{
    static void Main(string[] args)
    {
        Icu.Wrapper.Init();
        var test = new string[]
        {
            "\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f",
            "\U0001F3F4\U000E0067\U000E0062\U000E0065\U000E006E\U000E0067\U000E007F",
            "e\u0301",
            "\U0001F468\U0001F3FF", 
        };

        foreach (var t in test)
        {
            var len = GetLen(t);
            Console.WriteLine(len);
        }
    }

    static int GetLen(string test)
    {
        var ci = Icu.BreakIterator.CreateCharacterInstance(new Icu.Locale("en_US"));
        ci.SetText(test);
        int len = 0;
        while (ci.MoveNext() != Icu.BreakIterator.DONE)
        {
            len++;
        }
        return len;
    }
}
Run Code Online (Sandbox Code Playgroud)

Windows 控制台无法显示这些表情符号,但您可以在手表或 Visual Studio 的即时窗口中检查它们。

HTH,汤姆