Hatte gehofft, dass das evtl. schon jemand gemacht.
Ja, das hat schon jemand gemacht, aber dieser jemand ist dermaßen schlecht im Marketing, dass das natürlich keiner weiß. Das Beste an der Sache ist, dass es schon auf dem IBM i Server installiert ist: ICU von IBM , siehe Bibliothek QICU.

https://icu.unicode.org/

Hier ein Beispiel:

Code:
**FREE

ctl-opt dftactgrp(*no) actgrp(*caller) bnddir('QICU/QXICUAPIBD');


// U_CFUNC int32_t
// u_strToPunycode(const UChar *src, int32_t srcLength,
//                 UChar *dest, int32_t destCapacity,
//                 const UBool *caseFlags,
//                 UErrorCode *pErrorCode);
dcl-pr u_strToPunycode int(10) extproc('u_strToPunycode_4_0');
   source pointer value;
   sourceLength int(10) value; // -1 if NULL-terminated
   target pointer value;
   targetLength int(10) value;
   caseFlags pointer const; // array of int(10) (one per char) or NULL)
   errorCode int(10);
end-pr;

dcl-pr strlen uns(10) extproc('strlen');
   string pointer value;
end-pr;


main();
*inlr = *on;


dcl-proc main;
   dcl-s domain ucs2(50) ccsid(*utf16);
   dcl-s punycode ucs2(50) ccsid(*utf16);
   dcl-s rc int(10);
   dcl-s errorCode int(10);
   dcl-s message char(50);

   domain = 'küchen.de' + x'00';

   rc = u_strToPunycode(%addr(domain) : -1 : %addr(punycode) : %size(punycode) : *null : errorCode);

   message = 'Return code: ' + %char(rc);
   dsply message;
   message = 'Error code: ' + %char(errorCode);
   dsply message;

   message = punycode;
   dsply message;
end-proc;