diff --git a/src/libse/Common/Utilities.cs b/src/libse/Common/Utilities.cs
index 08f3657d5..dff438f41 100644
--- a/src/libse/Common/Utilities.cs
+++ b/src/libse/Common/Utilities.cs
@@ -1301,13 +1301,37 @@ namespace Nikse.SubtitleEdit.Core.Common
}
///
- /// UrlEncodes a string without the requirement for System.Web
+ /// UrlEncodes a string without the requirement for System.Web.
+ /// Will crash if text length > 2000.
///
public static string UrlEncode(string text)
{
return Uri.EscapeDataString(text);
}
+ ///
+ /// Calculates the length if the text url encoded.
+ ///
+ public static int UrlEncodeLength(string text)
+ {
+ var urlEncodeLength = 0;
+ foreach (var ch in text)
+ {
+ if (ch >= 'a' && ch <= 'z' ||
+ ch >= 'A' && ch <= 'Z' ||
+ ch >= '0' && ch <= '9')
+ {
+ urlEncodeLength++;
+ }
+ else
+ {
+ urlEncodeLength += 3;
+ }
+ }
+
+ return urlEncodeLength;
+ }
+
///
/// UrlDecodes a string without requiring System.Web
///
diff --git a/src/libse/Translate/Processor/TranslationProcessor.cs b/src/libse/Translate/Processor/TranslationProcessor.cs
index cae84f8f6..c86e1bc6b 100644
--- a/src/libse/Translate/Processor/TranslationProcessor.cs
+++ b/src/libse/Translate/Processor/TranslationProcessor.cs
@@ -47,7 +47,7 @@ namespace Nikse.SubtitleEdit.Core.Translate.Processor
{
public readonly List TranslationUnits = new List();
- public int TextSize => TranslationUnits.ConvertAll(e => Utilities.UrlEncode(e.Text).Length).Sum();
+ public int TextSize => TranslationUnits.ConvertAll(e => Utilities.UrlEncodeLength(e.Text)).Sum();
public int ArrayLength => TranslationUnits.Count;
}
@@ -103,7 +103,7 @@ namespace Nikse.SubtitleEdit.Core.Translate.Processor
foreach (var translationUnit in translationUnits)
{
- if (currentChunk.TextSize + Utilities.UrlEncode(translationUnit.Text).Length > maxTextSize
+ if (currentChunk.TextSize + Utilities.UrlEncodeLength(translationUnit.Text) > maxTextSize
|| currentChunk.ArrayLength + 1 > maximumRequestArrayLength)
{
yield return currentChunk;