OS/2 doesn't support UTF-8 as a process codepage.
It does support it as a PM message-queue codepage, but this has to be set after the program starts up and creates a message queue. You can force a change to a running PM app's message-queue codepage using CPPal (
https://hobbes.nmsu.edu/?detail=%2Fpub%2Fos2%2Futil%2Fwps%2FCpPal_0-30.zip) - in most cases this requires you to also reset the window font afterwards (e.g. using the Font Palette) to force a refresh.
However, this technique has limited usefulness, mainly because the standard PM controls aren't really designed to handle UTF-8. Static text controls may be semi-legible, but text fields will probably just show an unreadable overlapping mess.
UTF-8 (1208)
is supported as a GPI direct-rendering codepage, but it's apparently poorly optimized because rendering speed is atrociously slow. Raw UCS-2 (1200) is much faster to render in GPI, so in most cases it's better to internally convert UTF-8 to UCS-2 and render it that way. I once started to write a MLE control that could support Unicode encoded text (the source, such as it is, is still somewhere on my Github site), but I eventually found it was easier to just use Qt.
In most cases, if you want to render UTF-8 text (or any Unicode encoded text, actually) it's almost always preferable to use an alternative rendering library based on FreeType, like Cairo or Pango, as Qt and the Mozilla apps do.