Skip to content

Commit 2373f7c

Browse files
authored
Fix UTF-8 with BOM is introduced in the generated spawnmap.ini file (CnCNet#738)
* Fix UTF-8 BOM is introduced in the generated spawnmap.ini file * Provide UTF-8 without BOM encoding into EncodingExt class
1 parent 475713e commit 2373f7c

File tree

4 files changed

+30
-10
lines changed

4 files changed

+30
-10
lines changed

ClientCore/FileHelper.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using System.Threading.Tasks;
99

1010
using ClientCore.Extensions;
11+
using ClientCore.PlatformShim;
1112

1213
using Rampastring.Tools;
1314

@@ -91,17 +92,22 @@ public static void CreateHardLinkFromSource(string source, string destination, b
9192
}
9293
}
9394

94-
public static Encoding GetEncoding(string filename)
95+
public static Encoding GetEncoding(string filename, float minimalConfidence = 0.5f)
9596
{
96-
Encoding encoding = new UTF8Encoding(false);
97+
Encoding encoding = EncodingExt.UTF8NoBOM;
9798

9899
using (FileStream fs = File.OpenRead(filename))
99100
{
100101
Ude.CharsetDetector cdet = new Ude.CharsetDetector();
101102
cdet.Feed(fs);
102103
cdet.DataEnd();
103-
if (cdet.Charset != null)
104-
encoding = Encoding.GetEncoding(cdet.Charset);
104+
if (cdet.Charset != null && cdet.Confidence > minimalConfidence)
105+
{
106+
Encoding detectedEncoding = Encoding.GetEncoding(cdet.Charset);
107+
108+
if (detectedEncoding is not UTF8Encoding and not ASCIIEncoding)
109+
encoding = detectedEncoding;
110+
}
105111
}
106112

107113
return encoding;

ClientCore/PlatformShim/EncodingExt.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,6 @@ static EncodingExt()
1616
/// ANSI doesn't mean a specific codepage, it means the default non-Unicode codepage which can be changed from Control Panel.
1717
/// </summary>
1818
public static Encoding ANSI { get; }
19+
20+
public static Encoding UTF8NoBOM { get; } = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false);
1921
}

DXMainClient/DXGUI/Multiplayer/GameLobby/MapCodeHelper.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Linq;
4+
using System.Text;
5+
46
using ClientCore;
7+
using ClientCore.PlatformShim;
8+
59
using DTAClient.Domain.Multiplayer;
10+
611
using Rampastring.Tools;
712

813
namespace DTAClient.DXGUI.Multiplayer.GameLobby
@@ -17,14 +22,20 @@ public static class MapCodeHelper
1722
/// <param name="gameMode">Currently selected gamemode, if set.</param>
1823
public static void ApplyMapCode(IniFile mapIni, string customIniPath, GameMode gameMode)
1924
{
20-
IniFile associatedIni = new IniFile(SafePath.CombineFilePath(ProgramConstants.GamePath, customIniPath));
25+
string associatedIniPath = SafePath.CombineFilePath(ProgramConstants.GamePath, customIniPath);
26+
Encoding associatedIniEncoding = ClientConfiguration.Instance.ClientGameType == ClientCore.Enums.ClientType.TS ? FileHelper.GetEncoding(associatedIniPath) : EncodingExt.UTF8NoBOM;
27+
IniFile associatedIni = new IniFile(associatedIniPath, associatedIniEncoding);
2128
string extraIniName = null;
2229
if (gameMode != null)
2330
extraIniName = associatedIni.GetStringValue("GameModeIncludes", gameMode.Name, null);
2431
associatedIni.EraseSectionKeys("GameModeIncludes");
2532
ApplyMapCode(mapIni, associatedIni);
2633
if (!String.IsNullOrEmpty(extraIniName))
27-
ApplyMapCode(mapIni, new IniFile(SafePath.CombineFilePath(ProgramConstants.GamePath, extraIniName)));
34+
{
35+
string extraIniPath = SafePath.CombineFilePath(ProgramConstants.GamePath, extraIniName);
36+
Encoding extraIniEncoding = ClientConfiguration.Instance.ClientGameType == ClientCore.Enums.ClientType.TS ? FileHelper.GetEncoding(extraIniPath) : EncodingExt.UTF8NoBOM;
37+
ApplyMapCode(mapIni, new IniFile(extraIniPath, extraIniEncoding));
38+
}
2839
}
2940

3041
/// <summary>

DXMainClient/Domain/Multiplayer/Map.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
using static System.Collections.Specialized.BitVector32;
1717
using System.Diagnostics;
1818
using System.Text;
19+
using ClientCore.PlatformShim;
1920

2021
namespace DTAClient.Domain.Multiplayer
2122
{
@@ -712,15 +713,15 @@ public Texture2D LoadPreviewTexture()
712713

713714
public IniFile GetMapIni()
714715
{
715-
Encoding encoding = FileHelper.GetEncoding(CompleteFilePath);
716+
Encoding mapIniEncoding = ClientConfiguration.Instance.ClientGameType == ClientCore.Enums.ClientType.TS ? FileHelper.GetEncoding(CompleteFilePath) : EncodingExt.UTF8NoBOM;
716717

717-
var mapIni = new IniFile(CompleteFilePath, encoding);
718+
var mapIni = new IniFile(CompleteFilePath, mapIniEncoding);
718719

719720
if (!string.IsNullOrEmpty(ExtraININame))
720721
{
721722
string extraIniPath = SafePath.CombineFilePath(ProgramConstants.GamePath, "INI", "Map Code", ExtraININame);
722-
encoding = ClientConfiguration.Instance.ClientGameType == ClientCore.Enums.ClientType.TS ? FileHelper.GetEncoding(extraIniPath) : new UTF8Encoding(false);
723-
var extraIni = new IniFile(extraIniPath, encoding);
723+
Encoding extraIniEncoding = ClientConfiguration.Instance.ClientGameType == ClientCore.Enums.ClientType.TS ? FileHelper.GetEncoding(extraIniPath) : EncodingExt.UTF8NoBOM;
724+
var extraIni = new IniFile(extraIniPath, extraIniEncoding);
724725
IniFile.ConsolidateIniFiles(mapIni, extraIni);
725726
}
726727

0 commit comments

Comments
 (0)