On Windows, gpgme calls gettext_use_utf8(1) to enable UTF-8 encoded error descriptions in gpgrt, but this only affects the main thread (see T7185).
If Error::asString is first called from a secondary thread, then subsequent calls of Error::asString from the main thread return the error description in native encoding. This is caused by caching (which was introduced to control the lifetime of the char pointer returned by Error::asString) together with the current behavior that UTF-8 encoding is only used for the main thread.