表情符号unicode格式的字符串转换为单字符表情字符串
Conversion of String with emoticon unicode format to String with single character emoticon
我正在尝试将包含表示表情符号 Unicode 格式的字符串的 String
对象转换为 String
,并且将 Unicode 表示的相同表情符号作为其唯一字符,例如将 "\u1F34E"
转换为 </code>.</p>
<p>假设字符串的转义序列将被正确处理,我尝试了以下操作:</p>
<pre><code>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);
这不是看起来的样子
string str = "\u1F34E";
.Net 使用 UTF-16 对其字符串进行编码。这意味着两个字节(16 位)用于表示一个 Unicode 代码点。这反过来使 Unicode \u
转义序列实际上 U+0000
到 U+FFFF
(16 位)或扩展版本 U+00000000
至 U+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 for pointing out that the Unicode escape sequence actually supports both 16bit and 32bit variants \uXXXX
and \UXXXXXXXX
more information can be found in a blog post by Jon Skeet Strings in C# and .NET
我正在尝试将包含表示表情符号 Unicode 格式的字符串的 String
对象转换为 String
,并且将 Unicode 表示的相同表情符号作为其唯一字符,例如将 "\u1F34E"
转换为 </code>.</p>
<p>假设字符串的转义序列将被正确处理,我尝试了以下操作:</p>
<pre><code>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);
这不是看起来的样子
string str = "\u1F34E";
.Net 使用 UTF-16 对其字符串进行编码。这意味着两个字节(16 位)用于表示一个 Unicode 代码点。这反过来使 Unicode \u
转义序列实际上 U+0000
到 U+FFFF
(16 位)或扩展版本 U+00000000
至 U+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 for pointing out that the Unicode escape sequence actually supports both 16bit and 32bit variants \uXXXX
and \UXXXXXXXX
more information can be found in a blog post by Jon Skeet Strings in C# and .NET