Adapted from https://gitlab.archlinux.org/archlinux/packaging/packages/vcdimager/-/commit/88dc511b7f3dea8fb45e0c2bfa1345a75a088848
https://bugs.gentoo.org/955707
--- a/frontends/xml/vcd_xml_common.c
+++ b/frontends/xml/vcd_xml_common.c
@@ -242,17 +242,43 @@ _convert (const char in[], const char encoding[], bool from)
 
   temp = size - 1;
   if (from) {
+#if defined(LIBXML_VERSION) && LIBXML_VERSION >= 21400
+    if (!(handler->flags & 2) && NULL != handler->output.func)
+      ret = handler->output.func (handler->outputCtxt, out, &out_size, (const unsigned char *) in, &temp, 1);
+    if ((handler->flags & 2) && NULL != handler->output.legacyFunc)
+      ret = handler->output.legacyFunc (out, &out_size, (const unsigned char *) in, &temp);
+    else {
+      xmlCharEncCloseFunc(handler);
+      return strdup(in);
+    }
+#else
     if (NULL != handler->output)
       ret = handler->output (out, &out_size, (const unsigned char *) in, &temp);
     else
       return strdup(in);
+#endif
   } else {
+#if defined(LIBXML_VERSION) && LIBXML_VERSION >= 21400
+    if (!(handler->flags & 2) && NULL != handler->input.func)
+      ret = handler->input.func (handler->inputCtxt, out, &out_size, (const unsigned char *) in, &temp, 1);
+    if ((handler->flags & 2) && NULL != handler->input.legacyFunc)
+      ret = handler->input.legacyFunc (out, &out_size, (const unsigned char *) in, &temp);
+    else {
+      xmlCharEncCloseFunc(handler);
+      return strdup(in);
+    }
+#else
     if (NULL != handler->input)
       ret = handler->input (out, &out_size, (const unsigned char *) in, &temp);
     else
+#endif
       return strdup(in);
   }
 
+#if defined(LIBXML_VERSION) && LIBXML_VERSION >= 21400
+  xmlCharEncCloseFunc(handler);
+#endif
+
   if (ret < 0 || (temp - size + 1))
     {
       free (out);
