首页 > 解决方案 > 如何将转义的 unicode 转换为常规格式的 unicode

问题描述

我有这段代码可以帮助解析emojiunicode

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

标签: c#unicodeemoji

解决方案


看来,您想将两个代理字符组合成一个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

推荐阅读