DECLARE INTEGER MultiByteToWideChar IN kernel32;
INTEGER CodePg,;
LONG dwFlags,;
STRING lpMultiByteStr,;
INTEGER cbMultiByte,;
STRING @ lpWideCharStr,;
INTEGER cchWideChar
DECLARE INTEGER WideCharToMultiByte IN kernel32;
INTEGER CodePg,;
INTEGER dwFlags,;
STRING lpWideCharStr,;
INTEGER cchWideChar,;
STRING @ lpMultiByteStr,;
INTEGER cbMultiByte,;
STRING lpDefaultChar,;
INTEGER lpUsedDefaultChar
cString = ''+0hC7D3E320C7E1C8C7C6DA3A20C7E1DAC7E1E3EDC920E1E1D0E5C820E6C7E1E3C7D3
clear
*lcUTF8ByStrconv = STRCONV(cString,9,,)
*? CREATEBINARY(lcUTF8ByStrconv) && just for comparison what's the original VFP9 result.
LOCAL lcUTF16Buffer, lcUTF8Buffer
* Be generous with the bytes, usually double as many should suffice
* 2 for an eventual BOM, 4 for special surrogate characters that need two 16bit codepoints in UTF-16,
* (in the worst case all characters), 3 for three terminating 0 bytes.
lcUTF16Buffer = SPACE(2+4*LEN(cString)+3)
lcUTF8Buffer = SPACE(2+4*LEN(cString)+3)
lnResult = MultiByteToWideChar(1256,0,cString,LEN(cString),@lcUTF16Buffer,LEN(cString))
IF lnResult <> 0
lnResult = WideCharToMultiByte(65001, 0x0080, @lcUTF16Buffer, LEN(cString), @lcUTF8Buffer, LEN(lcUTF8Buffer),0,0)
ENDIF
IF lnResult <> 0
? CREATEBINARY(lcUTF16Buffer)
?
? CREATEBINARY(lcUTF8Buffer)
ENDIF
_cliptext = TRANSFORM(CREATEBINARY(RTRIM(lcUTF8Buffer)))