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