diff --git a/ShareX.HelpersLib/Emoji.cs b/ShareX.HelpersLib/Emoji.cs index e7a280d23..76b032d28 100644 --- a/ShareX.HelpersLib/Emoji.cs +++ b/ShareX.HelpersLib/Emoji.cs @@ -31,6 +31,21 @@ namespace ShareX.HelpersLib { public static class Emoji { + public static int SearchEmoji(string text) + { + int emojiLength = 0; + + foreach (string emoji in Emojis) + { + if (text.StartsWith(emoji, StringComparison.Ordinal)) + { + emojiLength = Math.Max(emojiLength, emoji.Length); + } + } + + return emojiLength; + } + public static void SaveEmojiList(string filePath) { File.WriteAllText(filePath, string.Join(Environment.NewLine, Emojis), Encoding.UTF8); diff --git a/ShareX.HelpersLib/Helpers/URLHelpers.cs b/ShareX.HelpersLib/Helpers/URLHelpers.cs index 4fc6ea5b6..4cc824c2c 100644 --- a/ShareX.HelpersLib/Helpers/URLHelpers.cs +++ b/ShareX.HelpersLib/Helpers/URLHelpers.cs @@ -115,6 +115,30 @@ public static string URLEncode(string text, bool isPath = false) return sb.ToString(); } + public static string URLEncodeIgnoreEmoji(string text, bool isPath = false) + { + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i < text.Length; i++) + { + string remainingText = text.Substring(i); + + int emojiLength = Emoji.SearchEmoji(remainingText); + + if (emojiLength > 0) + { + sb.Append(remainingText.Substring(0, emojiLength)); + i += emojiLength - 1; + } + else + { + sb.Append(URLEncode(remainingText.Substring(0, 1), isPath)); + } + } + + return sb.ToString(); + } + public static string RemoveBidiControlCharacters(string text) { return new string(text.Where(c => !BidiControlCharacters.Contains(c)).ToArray()); diff --git a/ShareX.UploadersLib/FileUploaders/AmazonS3.cs b/ShareX.UploadersLib/FileUploaders/AmazonS3.cs index f4399970b..7b0f661c5 100644 --- a/ShareX.UploadersLib/FileUploaders/AmazonS3.cs +++ b/ShareX.UploadersLib/FileUploaders/AmazonS3.cs @@ -263,7 +263,7 @@ public string GenerateURL(string uploadPath) { if (!string.IsNullOrEmpty(Settings.Endpoint) && !string.IsNullOrEmpty(Settings.Bucket)) { - uploadPath = URLHelpers.URLEncode(uploadPath, true); + uploadPath = URLHelpers.URLEncodeIgnoreEmoji(uploadPath, true); string url;