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#。
答案 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