diff --git a/PowerKit.Tests/EncodingExtensionsTests.cs b/PowerKit.Tests/EncodingExtensionsTests.cs new file mode 100644 index 0000000..c33bce2 --- /dev/null +++ b/PowerKit.Tests/EncodingExtensionsTests.cs @@ -0,0 +1,22 @@ +using System.Text; +using FluentAssertions; +using PowerKit.Extensions; +using Xunit; + +namespace PowerKit.Tests; + +public class EncodingExtensionsTests +{ + [Fact] + public void Utf8WithoutBom_Test() + { + // Arrange + var text = "hello, world! 🌍"; + + // Act + var bytes = Encoding.Utf8WithoutBom.GetBytes(text); + + // Assert + Encoding.UTF8.GetString(bytes).Should().Be(text); + } +} diff --git a/PowerKit/Extensions/EncodingExtensions.cs b/PowerKit/Extensions/EncodingExtensions.cs new file mode 100644 index 0000000..293e5ae --- /dev/null +++ b/PowerKit/Extensions/EncodingExtensions.cs @@ -0,0 +1,19 @@ +using System.Text; + +namespace PowerKit.Extensions; + +file static class EncodingEx +{ + public static Encoding Utf8WithoutBom { get; } = new UTF8Encoding(false); +} + +internal static class EncodingExtensions +{ + extension(Encoding) + { + /// + /// Gets an instance of the UTF-8 encoding that does not emit a byte order mark (BOM). + /// + public static Encoding Utf8WithoutBom => EncodingEx.Utf8WithoutBom; + } +} diff --git a/PowerKit/Extensions/ZipArchiveEntryExtensions.cs b/PowerKit/Extensions/ZipArchiveEntryExtensions.cs index 7011795..ca0ae70 100644 --- a/PowerKit/Extensions/ZipArchiveEntryExtensions.cs +++ b/PowerKit/Extensions/ZipArchiveEntryExtensions.cs @@ -1,3 +1,4 @@ +#if NET40_OR_GREATER || NETSTANDARD || NET using System; using System.Collections.Generic; using System.IO; @@ -10,8 +11,6 @@ namespace PowerKit.Extensions; internal static class ZipArchiveEntryExtensions { - private static readonly Encoding Utf8NoBom = new UTF8Encoding(false); - extension(ZipArchiveEntry entry) { /// @@ -42,7 +41,7 @@ public void WriteAllBytes(byte[] bytes) public string ReadAllText(Encoding? encoding = null) { using var stream = entry.Open(); - using var reader = new StreamReader(stream, encoding ?? Utf8NoBom); + using var reader = new StreamReader(stream, encoding ?? Encoding.UTF8); return reader.ReadToEnd(); } @@ -53,7 +52,7 @@ public string ReadAllText(Encoding? encoding = null) public void WriteAllText(string text, Encoding? encoding = null) { using var stream = entry.Open(); - using var writer = new StreamWriter(stream, encoding ?? Utf8NoBom); + using var writer = new StreamWriter(stream, encoding ?? Encoding.Utf8WithoutBom); writer.Write(text); } @@ -64,7 +63,7 @@ public void WriteAllText(string text, Encoding? encoding = null) public string[] ReadAllLines(Encoding? encoding = null) { using var stream = entry.Open(); - using var reader = new StreamReader(stream, encoding ?? Utf8NoBom); + using var reader = new StreamReader(stream, encoding ?? Encoding.UTF8); var lines = new List(); while (reader.ReadLine() is { } line) @@ -81,7 +80,7 @@ public string[] ReadAllLines(Encoding? encoding = null) public void WriteAllLines(IEnumerable lines, Encoding? encoding = null) { using var stream = entry.Open(); - using var writer = new StreamWriter(stream, encoding ?? Utf8NoBom); + using var writer = new StreamWriter(stream, encoding ?? Encoding.Utf8WithoutBom); foreach (var line in lines) { @@ -89,7 +88,6 @@ public void WriteAllLines(IEnumerable lines, Encoding? encoding = null) } } -#if NET40_OR_GREATER || NETSTANDARD || NET /// /// Reads all bytes from the zip archive entry asynchronously. /// @@ -126,7 +124,7 @@ public async Task ReadAllTextAsync( ) { using var stream = entry.Open(); - using var reader = new StreamReader(stream, encoding ?? Utf8NoBom); + using var reader = new StreamReader(stream, encoding ?? Encoding.UTF8); return await reader.ReadToEndAsync(cancellationToken).ConfigureAwait(false); } @@ -141,7 +139,7 @@ public async Task WriteAllTextAsync( ) { using var stream = entry.Open(); - using var writer = new StreamWriter(stream, encoding ?? Utf8NoBom); + using var writer = new StreamWriter(stream, encoding ?? Encoding.Utf8WithoutBom); await writer.WriteAsync(text.AsMemory(), cancellationToken).ConfigureAwait(false); await writer.FlushAsync(cancellationToken).ConfigureAwait(false); @@ -156,7 +154,7 @@ public async Task ReadAllLinesAsync( ) { using var stream = entry.Open(); - using var reader = new StreamReader(stream, encoding ?? Utf8NoBom); + using var reader = new StreamReader(stream, encoding ?? Encoding.UTF8); var lines = new List(); while (await reader.ReadLineAsync(cancellationToken).ConfigureAwait(false) is { } line) @@ -177,7 +175,7 @@ public async Task WriteAllLinesAsync( ) { using var stream = entry.Open(); - using var writer = new StreamWriter(stream, encoding ?? Utf8NoBom); + using var writer = new StreamWriter(stream, encoding ?? Encoding.Utf8WithoutBom); foreach (var line in lines) { @@ -188,6 +186,6 @@ await writer await writer.FlushAsync(cancellationToken).ConfigureAwait(false); } -#endif } } +#endif