diff --git a/internal/reader/encoding/encoding_test.go b/internal/reader/encoding/encoding_test.go
new file mode 100644
index 00000000..10d326ba
--- /dev/null
+++ b/internal/reader/encoding/encoding_test.go
@@ -0,0 +1,149 @@
+// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+package encoding // import "miniflux.app/v2/internal/reader/encoding"
+
+import (
+ "io"
+ "os"
+ "testing"
+ "unicode/utf8"
+)
+
+func TestCharsetReaderWithUTF8(t *testing.T) {
+ file := "testdata/utf8.xml"
+
+ f, err := os.Open(file)
+ if err != nil {
+ t.Fatalf("Unable to open file: %v", err)
+ }
+
+ reader, err := CharsetReader("UTF-8", f)
+ if err != nil {
+ t.Fatalf("Unable to create reader: %v", err)
+ }
+
+ data, err := io.ReadAll(reader)
+ if err != nil {
+ t.Fatalf("Unable to read data: %v", err)
+ }
+
+ if !utf8.Valid(data) {
+ t.Fatalf("Data is not valid UTF-8")
+ }
+}
+
+func TestCharsetReaderWithISO88591(t *testing.T) {
+ file := "testdata/iso-8859-1.xml"
+
+ f, err := os.Open(file)
+ if err != nil {
+ t.Fatalf("Unable to open file: %v", err)
+ }
+
+ reader, err := CharsetReader("ISO-8859-1", f)
+ if err != nil {
+ t.Fatalf("Unable to create reader: %v", err)
+ }
+
+ data, err := io.ReadAll(reader)
+ if err != nil {
+ t.Fatalf("Unable to read data: %v", err)
+ }
+
+ if !utf8.Valid(data) {
+ t.Fatalf("Data is not valid UTF-8")
+ }
+}
+
+func TestCharsetReaderWithWindows1252(t *testing.T) {
+ file := "testdata/windows-1252.xml"
+
+ f, err := os.Open(file)
+ if err != nil {
+ t.Fatalf("Unable to open file: %v", err)
+ }
+
+ reader, err := CharsetReader("windows-1252", f)
+ if err != nil {
+ t.Fatalf("Unable to create reader: %v", err)
+ }
+
+ data, err := io.ReadAll(reader)
+ if err != nil {
+ t.Fatalf("Unable to read data: %v", err)
+ }
+
+ if !utf8.Valid(data) {
+ t.Fatalf("Data is not valid UTF-8")
+ }
+}
+
+func TestCharsetReaderWithInvalidProlog(t *testing.T) {
+ file := "testdata/invalid-prolog.xml"
+
+ f, err := os.Open(file)
+ if err != nil {
+ t.Fatalf("Unable to open file: %v", err)
+ }
+
+ reader, err := CharsetReader("invalid", f)
+ if err != nil {
+ t.Fatalf("Unable to create reader: %v", err)
+ }
+
+ data, err := io.ReadAll(reader)
+ if err != nil {
+ t.Fatalf("Unable to read data: %v", err)
+ }
+
+ if !utf8.Valid(data) {
+ t.Fatalf("Data is not valid UTF-8")
+ }
+}
+
+func TestCharsetReaderWithUTF8DocumentWithIncorrectProlog(t *testing.T) {
+ file := "testdata/utf8-incorrect-prolog.xml"
+
+ f, err := os.Open(file)
+ if err != nil {
+ t.Fatalf("Unable to open file: %v", err)
+ }
+
+ reader, err := CharsetReader("ISO-8859-1", f)
+ if err != nil {
+ t.Fatalf("Unable to create reader: %v", err)
+ }
+
+ data, err := io.ReadAll(reader)
+ if err != nil {
+ t.Fatalf("Unable to read data: %v", err)
+ }
+
+ if !utf8.Valid(data) {
+ t.Fatalf("Data is not valid UTF-8")
+ }
+}
+
+func TestCharsetReaderWithWindows1252DocumentWithIncorrectProlog(t *testing.T) {
+ file := "testdata/windows-1252-incorrect-prolog.xml"
+
+ f, err := os.Open(file)
+ if err != nil {
+ t.Fatalf("Unable to open file: %v", err)
+ }
+
+ reader, err := CharsetReader("windows-1252", f)
+ if err != nil {
+ t.Fatalf("Unable to create reader: %v", err)
+ }
+
+ data, err := io.ReadAll(reader)
+ if err != nil {
+ t.Fatalf("Unable to read data: %v", err)
+ }
+
+ if !utf8.Valid(data) {
+ t.Fatalf("Data is not valid UTF-8")
+ }
+}
diff --git a/internal/reader/encoding/testdata/invalid-prolog.xml b/internal/reader/encoding/testdata/invalid-prolog.xml
new file mode 100644
index 00000000..7c8b1283
--- /dev/null
+++ b/internal/reader/encoding/testdata/invalid-prolog.xml
@@ -0,0 +1,7 @@
+
+
+ 테스트 피드
+
+ こんにちは世界
+
+
\ No newline at end of file
diff --git a/internal/reader/encoding/testdata/iso-8859-1.xml b/internal/reader/encoding/testdata/iso-8859-1.xml
new file mode 100644
index 00000000..a3d84f97
--- /dev/null
+++ b/internal/reader/encoding/testdata/iso-8859-1.xml
@@ -0,0 +1,7 @@
+
+
+
+ Caf
+ Prsentation
+
+
\ No newline at end of file
diff --git a/internal/reader/encoding/testdata/utf8-incorrect-prolog.xml b/internal/reader/encoding/testdata/utf8-incorrect-prolog.xml
new file mode 100644
index 00000000..96590162
--- /dev/null
+++ b/internal/reader/encoding/testdata/utf8-incorrect-prolog.xml
@@ -0,0 +1,7 @@
+
+
+ 테스트 피드
+
+ こんにちは世界
+
+
\ No newline at end of file
diff --git a/internal/reader/encoding/testdata/utf8.xml b/internal/reader/encoding/testdata/utf8.xml
new file mode 100644
index 00000000..11f10a5a
--- /dev/null
+++ b/internal/reader/encoding/testdata/utf8.xml
@@ -0,0 +1,7 @@
+
+
+ 테스트 피드
+
+ こんにちは世界
+
+
\ No newline at end of file
diff --git a/internal/reader/encoding/testdata/windows-1252-incorrect-prolog.xml b/internal/reader/encoding/testdata/windows-1252-incorrect-prolog.xml
new file mode 100644
index 00000000..6e2eda5f
--- /dev/null
+++ b/internal/reader/encoding/testdata/windows-1252-incorrect-prolog.xml
@@ -0,0 +1,6 @@
+
+
+
+ Euro €
+
+
\ No newline at end of file
diff --git a/internal/reader/encoding/testdata/windows-1252.xml b/internal/reader/encoding/testdata/windows-1252.xml
new file mode 100644
index 00000000..8e1e6c75
--- /dev/null
+++ b/internal/reader/encoding/testdata/windows-1252.xml
@@ -0,0 +1,6 @@
+
+
+
+ Euro
+
+
\ No newline at end of file