【问题标题】:How can I convert a escaped unicode to regular format unicode如何将转义的 unicode 转换为常规格式的 unicode
【发布时间】:2021-03-09 23:46:00
【问题描述】:

我有这段代码可以帮助解析 unicode 以获得 emoji

public string DecodeEncodedNonAsciiCharacters(string value)
{
    return Regex.Replace(
       value,
      @"\\u(?<Value>[a-zA-Z0-9]{4})",
       m =>
         ((char)int.Parse(m.Groups["Value"].Value, NumberStyles.HexNumber)).ToString();
    );
} 
   

所以我把我的代码这样写

DecodeEncodedNonAsciiCharacters("\uD83C\uDFCB\uD83C\uDFFF\u200D\u2642\uFE0F");

变成Console.WriteLine();,它给了我这个表情符号????????‍♂️所以我的问题是我怎样才能把它变成这个

"\uD83C\uDFCB\uD83C\uDFFF\u200D\u2642\uFE0F"

进入这个代码点

U+1F3CB, U+1F3FF, U+200D, U+2642, U+FE0F

以上代码点来自Emojipedia.org

【问题讨论】:

  • @"\\u(?&lt;Value&gt;[a-fA-F0-9]{4})" 注意fF
  • 帮我解决这个问题,我需要帮助将表情符号与此 json 文件从此处gist.github.com/oliveratgithub/… 匹配
  • 所以我可以获得与该表情符号相关的名称,我知道它可以用 Json.Net 完成,但我不知道如何实现它
  • 您似乎想将两个 surrogate 字符组合成一个 Utf-32。如果是你的情况,请看我的回答

标签: c# unicode emoji


【解决方案1】:

看来,您想将 两个代理 字符组合成 一个 Utf-32:

\uD83C\uDFCB => \U0001F3CB

如果是你的情况,你可以这样说:

代码:

public static IEnumerable<int> CombineSurrogates(string value) {
  if (null == value)
    yield break; // or throw new ArgumentNullException(name(value));

  for (int i = 0; i < value.Length; ++i) {
    char current = value[i];
    char next = i < value.Length - 1 ? value[i + 1] : '\0';

    if (char.IsSurrogatePair(current, next)) {
      yield return (char.ConvertToUtf32(current, next));

      i += 1;
    }
    else
      yield return (int)current;
  }
}

public static string DecodeEncodedNonAsciiCharacters(string value) =>
  string.Join(" ", CombineSurrogates(value).Select(code => $"U+{code:X4}"));

演示:

string data = "\uD83C\uDFCB\uD83C\uDFFF\u200D\u2642\uFE0F";

// If you want codes, uncomment the line below
//int[] codes = CombineSurrogates().ToArray(data);

string result = DecodeEncodedNonAsciiCharacters(data);

Console.Write(result);

结果:

U+1F3CB U+1F3FF U+200D U+2642 U+FE0F

【讨论】:

    猜你喜欢
    • 2017-05-18
    • 2021-12-26
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    相关资源
    最近更新 更多