Skip to content

Commit c486f9d

Browse files
committed
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 662e8af commit c486f9d

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
@@ -14,6 +14,7 @@
1414
using Point = Microsoft.Xna.Framework.Point;
1515
using System.Diagnostics;
1616
using System.Text;
17+
using ClientCore.PlatformShim;
1718

1819
namespace DTAClient.Domain.Multiplayer
1920
{
@@ -607,15 +608,15 @@ public Texture2D LoadPreviewTexture()
607608

608609
public IniFile GetMapIni()
609610
{
610-
Encoding encoding = FileHelper.GetEncoding(CompleteFilePath);
611+
Encoding mapIniEncoding = ClientConfiguration.Instance.ClientGameType == ClientCore.Enums.ClientType.TS ? FileHelper.GetEncoding(CompleteFilePath) : EncodingExt.UTF8NoBOM;
611612

612-
var mapIni = new IniFile(CompleteFilePath, encoding);
613+
var mapIni = new IniFile(CompleteFilePath, mapIniEncoding);
613614

614615
if (!string.IsNullOrEmpty(ExtraININame))
615616
{
616617
string extraIniPath = SafePath.CombineFilePath(ProgramConstants.GamePath, "INI", "Map Code", ExtraININame);
617-
encoding = ClientConfiguration.Instance.ClientGameType == ClientCore.Enums.ClientType.TS ? FileHelper.GetEncoding(extraIniPath) : new UTF8Encoding(false);
618-
var extraIni = new IniFile(extraIniPath, encoding);
618+
Encoding extraIniEncoding = ClientConfiguration.Instance.ClientGameType == ClientCore.Enums.ClientType.TS ? FileHelper.GetEncoding(extraIniPath) : EncodingExt.UTF8NoBOM;
619+
var extraIni = new IniFile(extraIniPath, extraIniEncoding);
619620
IniFile.ConsolidateIniFiles(mapIni, extraIni);
620621
}
621622

0 commit comments

Comments
 (0)