diff --git a/Makefile.am b/Makefile.am
index 16cd80b9a..f126efeee 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -465,6 +465,7 @@ libicu_a_CPPFLAGS = $(AM_CPPFLAGS) \
 	$(ICU_CFLAGS)
 
 ICU_LDADD = libicu.a $(ICU_LIBS)
+ICU_LDADD += $(GLIB_LIBS)
 
 # PCM library
 
@@ -1484,7 +1485,8 @@ C_TESTS = \
 	test/test_mixramp \
 	test/test_pcm \
 	test/test_protocol \
-	test/test_queue_priority
+	test/test_queue_priority \
+	test/TestIcu
 
 if ENABLE_CURL
 C_TESTS += test/test_icy_parser
@@ -2121,6 +2123,15 @@ test_test_queue_priority_LDADD = \
 	libutil.a \
 	$(CPPUNIT_LIBS)
 
+test_TestIcu_SOURCES = \
+	test/TestIcu.cxx
+test_TestIcu_CPPFLAGS = $(AM_CPPFLAGS) $(CPPUNIT_CFLAGS) -DCPPUNIT_HAVE_RTTI=0
+test_TestIcu_CXXFLAGS = $(AM_CXXFLAGS) -Wno-error=deprecated-declarations
+test_TestIcu_LDADD = \
+	$(ICU_LDADD) \
+	libutil.a \
+	$(CPPUNIT_LIBS)
+
 if ENABLE_DSD
 
 noinst_PROGRAMS += src/pcm/dsd2pcm/dsd2pcm
diff --git a/test/TestIcu.cxx b/test/TestIcu.cxx
new file mode 100644
index 000000000..9d525d698
--- /dev/null
+++ b/test/TestIcu.cxx
@@ -0,0 +1,82 @@
+/*
+ * Unit tests for src/util/
+ */
+
+#include "config.h"
+#include "lib/icu/Converter.hxx"
+#include "util/Error.hxx"
+
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/TestFactoryRegistry.h>
+#include <cppunit/ui/text/TestRunner.h>
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <string.h>
+#include <stdlib.h>
+
+#ifdef HAVE_ICU_CONVERTER
+
+static const char *const invalid_utf8[] = {
+	"\xfc",
+};
+
+struct StringPair {
+	const char *utf8, *other;
+};
+
+static constexpr StringPair latin1_tests[] = {
+	{ "foo", "foo" },
+	{ "\xc3\xbc", "\xfc" },
+};
+
+class TestIcuConverter : public CppUnit::TestFixture {
+	CPPUNIT_TEST_SUITE(TestIcuConverter);
+	CPPUNIT_TEST(TestInvalidCharset);
+	CPPUNIT_TEST(TestLatin1);
+	CPPUNIT_TEST_SUITE_END();
+
+public:
+	void TestInvalidCharset() {
+		CPPUNIT_ASSERT_EQUAL((IcuConverter *)nullptr,
+				     IcuConverter::Create("doesntexist",
+							  IgnoreError()));
+	}
+
+	void TestLatin1() {
+		IcuConverter *const converter =
+			IcuConverter::Create("iso-8859-1", IgnoreError());
+		CPPUNIT_ASSERT(converter != nullptr);
+
+		for (const auto i : invalid_utf8) {
+			auto f = converter->FromUTF8(i);
+			CPPUNIT_ASSERT_EQUAL(true, f.empty());
+		}
+
+		for (const auto i : latin1_tests) {
+			auto f = converter->FromUTF8(i.utf8);
+			CPPUNIT_ASSERT_EQUAL(true, f == i.other);
+
+			auto t = converter->ToUTF8(i.other);
+			CPPUNIT_ASSERT_EQUAL(true, t == i.utf8);
+		}
+
+		delete converter;
+	}
+};
+
+CPPUNIT_TEST_SUITE_REGISTRATION(TestIcuConverter);
+
+#endif
+
+int
+main(gcc_unused int argc, gcc_unused char **argv)
+{
+#ifdef HAVE_ICU_CONVERTER
+	CppUnit::TextUi::TestRunner runner;
+	auto &registry = CppUnit::TestFactoryRegistry::getRegistry();
+	runner.addTest(registry.makeTest());
+	return runner.run() ? EXIT_SUCCESS : EXIT_FAILURE;
+#else
+	return EXIT_SUCCESS;
+#endif
+}