【问题标题】:Conversion of String with emoticon unicode format to String with single character emoticon将带有表情符号unicode格式的字符串转换为带有单个字符表情符号的字符串
【发布时间】:2021-01-23 00:40:58
【问题描述】:

我正在尝试将包含表示表情符号的 Unicode 格式的字符串的 String 对象转换为 String,并将 Unicode 表示的表情符号作为其唯一字符,例如将"\u1F34E" 转换为????

假设字符串的转义序列将被正确处理,我尝试了以下操作:

String str = "\u1F34E";
Console.WriteLine("'{0}' to '{1}'", str, str.ToCharArray()[0]);

输出:

'\u1F34E' to '\'

将字符串直接输出到文本文件会产生相同的结果,因此它不仅仅是我使用的调试器。我不确定该怎么做。任何帮助将不胜感激。

编辑:

我意识到我最初的问题并不清楚;我的意图是在字符串中有一个格式正确的 UTF-16 字符串和一个 UTF-32 unicode,作为一个 API,我发送这个值需要这种格式。我已经成功解决了以下问题:

String str = "1F34E"; //removed \u with prior parsing
int unicode_utf32 = int.Parse(stdemote.Unicode, System.Globalization.NumberStyles.HexNumber);
String unicode_utf16_str = Char.ConvertFromUtf32(unicode_utf32);
Console.WriteLine("'{0}' to '{1}'", str, unicode_utf16_str);

【问题讨论】:

  • 请注意,帖子中显示的代码不会产生您声称的输出。目前还不清楚您是否正在寻找如何在 C# 字符串 中表示非基本平面表情符号字符,您实际上有来自其他地方的表示形式,其格式类似于 C# 字符串,并且您希望将其转换为C# 字符串 您不知道非基本平面 Unicode 代码点如何在 .Net 字符串中表示并询问...

标签: c# unicode


【解决方案1】:

这不是看起来的样子

string str = "\u1F34E";

.Net 使用 UTF-16 对其字符串进行编码。这意味着两个字节(16 位)用于表示一个 Unicode 代码点。这反过来使 Unicode \u 转义序列实际上是 U+0000U+FFFF(16 位)或扩展版本 U+00000000U+FFFFFFFF(32 位)

表情符号?,使用高代码点0001F34E,因此需要将其编码为代理对,两个UTF-16字符"\uD83C\uDF4E"或组合为
"\U0001F34E" 1

示例

string str = "\uD83C\uDF4E";
// or
string str = "\U0001F34E"

如果您的目标是将实际文本元素与字符分开,您可以使用StringInfo.GetTextElementEnumerator

public static IEnumerable<string> ToElements(string source)
{
   var enumerator = StringInfo.GetTextElementEnumerator(source);
   while (enumerator.MoveNext())
      yield return enumerator.GetTextElement();
}

注意:我使用的术语可能不是最常见或最准确的,如果您认为可以收紧,请随时编辑


1 感谢Mark Tolonen 指出Unicode 转义序列 实际上同时支持16 位和32 位变体\uXXXX\UXXXXXXXX 可以找到更多信息在 Jon Skeet 的博客文章中Strings in C# and .NET

【讨论】:

  • 谢谢,这正是我遇到的问题。我使用上面编辑过的原始帖子中的代码来解决问题。
  • C# 允许\U0001F34E 转义码,因此您不必手动构建代理。
  • @MarkTolonen 我非常感谢这个评论,我会尽快制定更新
  • 没问题。这是一个参考:csharpindepth.com/articles/Strings
  • @MarkTolonen,再次感谢您的输入、更新和归因
猜你喜欢
  • 2018-08-28
  • 2019-05-20
  • 1970-01-01
  • 2021-10-04
  • 2020-12-27
  • 2016-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多