Improve encoding for header in EBU STL - thx Ingo S :)

This commit is contained in:
Nikolaj Olsson 2020-02-13 20:06:15 +01:00
parent ef1a56c066
commit 68c8f4454a

View File

@ -264,7 +264,7 @@ namespace Nikse.SubtitleEdit.Core.SubtitleFormats
buffer[14] = JustificationCode; buffer[14] = JustificationCode;
buffer[15] = CommentFlag; buffer[15] = CommentFlag;
var encoding = Encoding.GetEncoding(1252); var encoding = GetEncoding(header.CodePageNumber);
if (header.LanguageCode == LanguageCodeChinese) if (header.LanguageCode == LanguageCodeChinese)
{ {
var lines = HtmlUtil.RemoveHtmlTags(TextField, true).SplitToLines(); var lines = HtmlUtil.RemoveHtmlTags(TextField, true).SplitToLines();
@ -748,7 +748,7 @@ namespace Nikse.SubtitleEdit.Core.SubtitleFormats
if (subtitle.Header != null && subtitle.Header.Length == 1024 && (subtitle.Header.Contains("STL24") || subtitle.Header.Contains("STL25") || subtitle.Header.Contains("STL29") || subtitle.Header.Contains("STL30"))) if (subtitle.Header != null && subtitle.Header.Length == 1024 && (subtitle.Header.Contains("STL24") || subtitle.Header.Contains("STL25") || subtitle.Header.Contains("STL29") || subtitle.Header.Contains("STL30")))
{ {
header = ReadHeader(Encoding.UTF8.GetBytes(subtitle.Header)); header = ReadHeader(GetEncoding(subtitle.Header.Substring(0, 3)).GetBytes(subtitle.Header));
EbuUiHelper.Initialize(header, EbuUiHelper.JustificationCode, null, subtitle); EbuUiHelper.Initialize(header, EbuUiHelper.JustificationCode, null, subtitle);
} }
else else
@ -782,7 +782,7 @@ namespace Nikse.SubtitleEdit.Core.SubtitleFormats
} }
} }
byte[] buffer = Encoding.GetEncoding(1252).GetBytes(header.ToString()); var buffer = GetEncoding(header.CodePageNumber).GetBytes(header.ToString());
stream.Write(buffer, 0, buffer.Length); stream.Write(buffer, 0, buffer.Length);
int subtitleNumber = 0; int subtitleNumber = 0;
@ -1031,7 +1031,7 @@ namespace Nikse.SubtitleEdit.Core.SubtitleFormats
public static EbuGeneralSubtitleInformation ReadHeader(byte[] buffer) public static EbuGeneralSubtitleInformation ReadHeader(byte[] buffer)
{ {
var enc = Encoding.GetEncoding(1252); var enc = GetEncoding(Encoding.ASCII.GetString(buffer, 0, 3));
var header = new EbuGeneralSubtitleInformation var header = new EbuGeneralSubtitleInformation
{ {
CodePageNumber = enc.GetString(buffer, 0, 3), CodePageNumber = enc.GetString(buffer, 0, 3),
@ -1063,6 +1063,18 @@ namespace Nikse.SubtitleEdit.Core.SubtitleFormats
return header; return header;
} }
private static Encoding GetEncoding(string codePageNumber)
{
try
{
return Encoding.GetEncoding(int.TryParse(codePageNumber, out int cp) ? cp : 437);
}
catch (NotSupportedException)
{
return Encoding.GetEncoding(437);
}
}
/// <summary> /// <summary>
/// Get text with regard code page from header /// Get text with regard code page from header
/// </summary> /// </summary>