如何创建一个包含代理对的字符串

本文关键字:代理 包含 字符串 一个 何创建 创建 | 更新日期: 2023-09-27 17:53:20

我在Jon Skeet的博客上看到了这篇关于字符串反转的文章。我想尝试一下他给我展示的例子,但它似乎有效……这让我相信我不知道如何创建一个包含代理对的字符串,这实际上会导致字符串反转失败。如何创建一个包含代理对的字符串,以便我可以自己看到失败?

如何创建一个包含代理对的字符串

最简单的方法是使用'U########,其中U为大写,#表示正好8个十六进制数字。如果值超过0000FFFF十六进制,则需要一个代理对:

string myString = "In the game of mahjong 'U0001F01C denotes the Four of circles";

您可以检查myString.Length以查看一个Unicode字符占用两个。net Char值。请注意,char类型有两个static方法,这些方法将帮助您确定char是否是代理对的一部分。

如果您使用的.NET语言没有'U########转义序列之类的东西,则可以使用ConvertFromUtf32方法,例如:

string fourCircles = char.ConvertFromUtf32(0x1F01C);

添加:如果你的c#源文件有一个允许所有Unicode字符的编码,比如UTF-8,你可以直接把字符放到文件中(通过复制-粘贴)。例如:

string myString = "In the game of mahjong    denotes the Four of circles";

该字符在源文件中是UTF-8编码的(在我的示例中),但是当应用程序运行并且字符串在内存中时将被UTF-16编码(代理对)。

不确定Stack Overflow软件是否正确处理我的麻将字符。尝试点击"编辑"到这个答案,并从那里的文本复制粘贴,如果"有趣"字符不在这里。

术语"代理对"是指在UTF-16编码方案中使用高码点编码Unicode字符的一种方法(更多信息请参阅本页);

Unicode字符编码中,字符被映射到0x0000000x10FFFF之间的值。在内部,UTF-16编码方案用于存储Unicode文本的字符串,其中考虑了两字节(16-bit)代码序列。由于两个字节只能包含从0x00000xFFFF的字符范围,因此存储超出此范围(0x0100000x10FFFF)的值会增加一些额外的复杂性。

这是使用称为代理的代码点对完成的。代理字符被分为两个不同的范围,称为low surrogateshigh surrogates,这取决于它们是允许出现在双码序列的开始还是结束。

你自己试试:

String surrogate = "abc" + Char.ConvertFromUtf32(Int32.Parse("2A601", NumberStyles.HexNumber)) + "def";
Char[] surrogateArray = surrogate.ToCharArray();
Array.Reverse(surrogateArray);
String surrogateReversed = new String(surrogateArray);

或者这个,如果你想坚持博客的例子:

String surrogate = "Les Mise" + Char.ConvertFromUtf32(Int32.Parse("0301", NumberStyles.HexNumber)) + "rables";
Char[] surrogateArray = surrogate.ToCharArray();
Array.Reverse(surrogateArray);
String surrogateReversed = new String(surrogateArray);

n,然后用调试器检查字符串值。乔恩·斯基特说得太对了……字符串和日期看起来很简单,但它们绝对不是。