public static void Run() { Console.WriteLine("Converting ox emoji to UTF-16 and UTF-8"); Rune rune = Rune.GetRuneAt("🐂", 0); Console.WriteLine($"Rune value: {rune.Value}"); // <SnippetUtf16CharArray> char[] chars = new char[rune.Utf16SequenceLength]; int numCharsWritten = rune.EncodeToUtf16(chars); // </SnippetUtf16CharArray> Console.WriteLine($"Number of chars: {numCharsWritten}"); // <SnippetUtf16String> string theString = rune.ToString(); // </SnippetUtf16String> // <SnippetUtf8ByteArray> byte[] bytes = new byte[rune.Utf8SequenceLength]; int numBytesWritten = rune.EncodeToUtf8(bytes); // </SnippetUtf8ByteArray> Console.WriteLine($"Number of UTF-8 bytes: {numBytesWritten}"); }
[InlineData("x\U0001F46Ey", 1, 0x1F46E)] // U+1F46E POLICE OFFICER public static void GetRuneAt_TryGetRuneAt_Utf16_Success(string inputString, int index, int expectedScalarValue) { // GetRuneAt Assert.Equal(expectedScalarValue, Rune.GetRuneAt(inputString, index).Value); // TryGetRuneAt Assert.True(Rune.TryGetRuneAt(inputString, index, out Rune rune)); Assert.Equal(expectedScalarValue, rune.Value); }
public static void GetRuneAt_TryGetRuneAt_Utf16_BadArgs() { // null input Assert.Throws <ArgumentNullException>("input", () => Rune.GetRuneAt(null, 0)); // negative index specified Assert.Throws <ArgumentOutOfRangeException>("index", () => Rune.GetRuneAt("hello", -1)); // index goes past end of string Assert.Throws <ArgumentOutOfRangeException>("index", () => Rune.GetRuneAt(string.Empty, 0)); }
[InlineData(new char[] { 'x', '\uD800' }, 1)] // end of string reached before could complete surrogate pair public static void GetRuneAt_TryGetRuneAt_Utf16_InvalidData(char[] inputCharArray, int index) { string inputString = new string(inputCharArray); // GetRuneAt Assert.Throws <ArgumentException>("index", () => Rune.GetRuneAt(inputString, index)); // TryGetRuneAt Assert.False(Rune.TryGetRuneAt(inputString, index, out Rune rune)); Assert.Equal(0, rune.Value); }
private async Task HandleReactionAddedAsync(Cacheable <IUserMessage, ulong> reactionMessage, ISocketMessageChannel reactionChannel, SocketReaction reaction) { if (reaction.User.IsSpecified && reaction.User.Value.IsBot) { return; } var rune = Rune.GetRuneAt(reaction.Emote.Name, 0); var message = await reactionMessage.GetOrDownloadAsync(); var menu = BotContext.Menus.FirstOrDefault(m => m.MessageID == message.Id); if (menu != null) { await message.RemoveReactionAsync(reaction.Emote, reaction.User.Value); } if (menu?.UserID == reaction.UserId && rune.Value >= ENCLOSED_A_INT && rune.Value < (ENCLOSED_A_INT + 26)) { int i = rune.Value - ENCLOSED_A_INT; if (i < menu.Menu.Options.Count) { var option = menu.Menu.Options[i]; var result = option.Action(); switch (result) { case string response: await message.DeleteAsync(); await reactionChannel.SendMessageAsync("Menu Result: " + response); BotContext.Menus.Remove(menu); break; case Menu submenu: await message.RemoveAllReactionsAsync(); await message.ModifyAsync(m => m.Embed = MenuHandler.ConvertMenuToEmbed(submenu)); foreach (var o in submenu.Options) { await message.AddReactionAsync(new Emoji((new Rune(127462 + i++).ToString())), new RequestOptions { RetryMode = RetryMode.RetryRatelimit }); } submenu.BackReference = menu.Menu; menu.Menu = submenu; break; default: throw new ArgumentOutOfRangeException(); } } } }
private static void TestUtf8String() { Rune rune = Rune.GetRuneAt("😃", 0); byte[] t = new byte[12]; t[0] = (byte)'a'; t[1] = (byte)'b'; t[2] = (byte)'c'; t[3] = (byte)'d'; rune.EncodeToUtf8(t.AsSpan(4)); t[8 + 0] = (byte)'e'; t[8 + 1] = (byte)'f'; t[8 + 2] = (byte)'g'; t[8 + 3] = (byte)'h'; var s = new Utf8Splitter(t, default, StringSplitOptions.None);