diff --git a/reader/rss/parser_test.go b/reader/rss/parser_test.go
index 6767212756fa76cd9d144d152721fb557bdc3ca5..197994c71f7bd9ca341dc256cc19a705a21f43f5 100644
--- a/reader/rss/parser_test.go
+++ b/reader/rss/parser_test.go
@@ -998,6 +998,25 @@ func TestParseFeedTitleWithHTMLEntity(t *testing.T) {
 	}
 }
 
+func TestParseFeedTitleWithUnicodeEntityAndCdata(t *testing.T) {
+	data := `<?xml version="1.0" encoding="utf-8"?>
+		<rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
+		<channel>
+			<link>https://example.org/</link>
+			<title><![CDATA[Jenny&#8217;s Newsletter]]></title>
+		</channel>
+		</rss>`
+
+	feed, err := Parse("https://example.org/", bytes.NewBufferString(data))
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if feed.Title != `Jenny’s Newsletter` {
+		t.Errorf(`Incorrect title, got: %q`, feed.Title)
+	}
+}
+
 func TestParseItemTitleWithHTMLEntity(t *testing.T) {
 	data := `<?xml version="1.0" encoding="utf-8"?>
 		<rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
diff --git a/reader/rss/rss.go b/reader/rss/rss.go
index 01caada4166e7db30a0135794999a8762585d179..db08239321f21cb64b2cd0639d9625037023b8dc 100644
--- a/reader/rss/rss.go
+++ b/reader/rss/rss.go
@@ -53,7 +53,7 @@ func (r *rssFeed) Transform(baseURL string) *model.Feed {
 		feed.FeedURL = feedURL
 	}
 
-	feed.Title = strings.TrimSpace(r.Title)
+	feed.Title = html.UnescapeString(strings.TrimSpace(r.Title))
 	if feed.Title == "" {
 		feed.Title = feed.SiteURL
 	}