когдато давно взято с этого форума, возможно поможет
X++:
#define.CP_ACP(0)
#define.CP_UTF8(65001)
static str Utf2Ansi(str Utf8)
{
DLL _kernelDLL = new DLL("KERNEL32");
DLLFunction MultiByteToWideChar = new DLLFunction(_kernelDLL, "MultiByteToWideChar");
DLLFunction WideCharToMultiByte = new DLLFunction(_kernelDLL, "WideCharToMultiByte");
Binary buf, buf1;
int len;
str res;
res = "";
if (Utf8)
{
buf = new Binary(strlen(Utf8));
buf.string(0, Utf8);
buf1 = new Binary((strlen(Utf8) + 1) * 2);
MultiByteToWideChar.returns(ExtTypes::DWord);
MultiByteToWideChar.arg(ExtTypes::DWord, ExtTypes::DWord, ExtTypes::Pointer, ExtTypes::DWord,
ExtTypes::Pointer, ExtTypes::DWord);
if (MultiByteToWideChar.call(#CP_UTF8, 0, buf, strlen(Utf8) + 1, buf1, strlen(Utf8) + 1))
{
WideCharToMultiByte.returns(ExtTypes::DWord);
WideCharToMultiByte.arg(ExtTypes::DWord, ExtTypes::DWord, ExtTypes::Pointer, ExtTypes::DWord,
ExtTypes::Pointer, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord);
len = WideCharToMultiByte.call(#CP_ACP, 0, buf1, strlen(Utf8) + 1, buf, 0, 0, 0);
if (len)
{
buf = new Binary(len);
if (WideCharToMultiByte.call(#CP_ACP, 0, buf1, strlen(Utf8) + 1, buf, len, 0, 0))
{
res = buf.string(0);
}
}
}
}
return res;
}