如何在C#

时间:2018-07-24 15:29:55

标签: c# .net

English-flag-emoji由14个字节的数据组成,合并后将呈现一个字符-

如果我有如下代码:

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

Console.WriteLine(test);
Console.WriteLine(test.Length);

它将打印字符和数字14。我以某种方式希望它返回1。在互联网上寻找答案时,我找到了以下解决方案:

var stringInfo = new System.Globalization.StringInfo(test);
Console.WriteLine(stringInfo.LengthInTextElements);

问题是,它改为打印7。我猜它将它解释为双字节unicode,只是给了我一半的字节长度。有关工作示例,请参见此dotnetfiddle

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

这是用Swift编写的类似测试,在OSX上的XCode中运行,显然它可以按照我的要求工作,但是我需要用C#。

Swift playground

4 个答案:

答案 0 :(得分:2)

从您的链接:

  

英格兰表情符号是“挥舞着黑旗”,“标记拉丁小写字母G”,“标记拉丁小写字母B”,“标记拉丁小写字母E”,“标记拉丁小写字母N”,“标记拉丁小写字母G”和“取消标记”表情符号的序列。

这些是7个unicode字符,因此答案7是正确的。显示unicode字符的规则很复杂。在某些系统上,它将显示英格兰国旗,而在我的系统上则不显示。

您可以尝试使用ScriptItemize函数或GetGlyphIndicesW函数为您进行计数。

答案 1 :(得分:1)

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

基于此,这似乎可行:
安装NuGet软件包:

并尝试以下代码:

#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cctype>

char my_toupper(char ch)
{
    return std::toupper(static_cast<unsigned char>(ch));
}

char my_tolower(char ch)
{
    return std::tolower(static_cast<unsigned char>(ch));
}

int main(int argc, char *argv[])
{
    int ncounter = std::atoi(argv[1]);
    std::string word;

    while (cin >> word)
    {
        std::transform(word.begin(), word.end(), word.begin(), my_tolower);
        if (word.size() >= ncounter)
            word[ncounter-1] = my_toupper(word[ncounter-1]);
        std::cout << word << "\n";
    }

    return 0;
}

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

HTH,汤姆

答案 2 :(得分:0)

长评论(可能不是一个答案)。

序列"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f"是一个相当新的Unicode标准,例如参见Wikipedia: Tags (Unicode block)。 .NET尚不支持此功能(也许永远不会)。

编写自己的支持该方法的方法。

顺便说一句,而不是写:

"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f"

我认为写得更清楚:

"\U0001F3F4\U000E0067\U000E0062\U000E0065\U000E006E\U000E0067\U000E007F"

当然是相同的字符串。

如果您的源代码文件采用支持Unicode的编码,则您还可以使用:

""

当然。

答案 3 :(得分:0)

在 .NET 5 中只需使用 StringInfo.LengthInTextElements。 .NET 以前版本中的此方法在这些表情符号上有错误的行为。你可以看看这个blog

在我的 C# Interactive(.NET Core 模式)中,我得到了这个结果:

> Environment.Version
[5.0.7]
> var stringInfo = new System.Globalization.StringInfo("???????");
. Console.WriteLine(stringInfo.LengthInTextElements);
1