在英语标志,表情图案由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,汤姆
| 归档时间: |
|
| 查看次数: |
859 次 |
| 最近记录: |