//+------------------------------------------------------------------+ //| Test2.mq5 | //| Copyright 2026, Niquel Mendoza. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2026, Niquel Mendoza." #property link "https://www.mql5.com" #property version "1.00" #property strict //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ char Utf32_8Len6(uint v) { return v < 0x80 ? 1 : (v < 0x800 ? 2 : (v < 0x10000 ? 3 : 4)); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void Utf32to8(const uint& in[], uchar& out[]) { //--- int w = 0; int req = ArraySize(in) << 2; if(req > ArraySize(out)) ArrayResize(out, req); //--- for(int i = 0; i < ArraySize(in); i++) { const uint v = in[i]; switch(Utf32_8Len6(v)) { case 1: { out[w++] = uchar(v); break; } case 2: { out[w++] = uchar(0xC0 | (v >> 6)); out[w++] = uchar(0x80 | (v & 0x3f)); break; } case 3: { out[w++] = uchar(0xE0 | (v >> 12)); out[w++] = uchar(0x80 | ((v >> 6) & 0x3f)); out[w++] = uchar(0x80 | (v & 0x3f)); break; } case 4: { out[w++] = uchar(0xF0 | (v >> 18)); out[w++] = uchar(0x80 | ((v >> 12) & 0x3F)); out[w++] = uchar(0x80 | ((v >> 6) & 0x3F)); out[w++] = uchar(0x80 | (v & 0x3F)); break; } default: break; } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void Utf32to82(const uint& in[], uchar& out[]) { //--- int w = 0; int req = ArraySize(in) << 2; if(req > ArraySize(out)) ArrayResize(out, req); //--- for(int i = 0; i < ArraySize(in); i++) { const uint v = in[i]; if(v < 0x80) { out[w++] = uchar(v); } else if(v < 0x800) { out[w++] = uchar(0xC0 | (v >> 6)); out[w++] = uchar(0x80 | (v & 0x3f)); } else if(v < 0x10000) { out[w++] = uchar(0xE0 | (v >> 12)); out[w++] = uchar(0x80 | ((v >> 6) & 0x3f)); out[w++] = uchar(0x80 | (v & 0x3f)); } else { out[w++] = uchar(0xF0 | (v >> 18)); out[w++] = uchar(0x80 | ((v >> 12) & 0x3F)); out[w++] = uchar(0x80 | ((v >> 6) & 0x3F)); out[w++] = uchar(0x80 | (v & 0x3F)); } } } //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- #define SIZE (8192) //--- MathSrand(16551); uint32_t in[]; ArrayResize(in, SIZE); for(int i = 0; i < SIZE; i++) { in[i] = MathRand(); } //--- uchar out[]; uchar o2[]; //--- ulong a = GetMicrosecondCount(); for(int i = 0; i < 10000; i++) { Utf32to8(in, out); } ulong b = GetMicrosecondCount(); Print("time: ", (b - a), " ", ArrayMaximum(out)); //--- a = GetMicrosecondCount(); for(int i = 0; i < 10000; i++) { Utf32to8(in, o2); } b = GetMicrosecondCount(); Print("time: ", (b - a), " ", ArrayMaximum(o2)); } //+------------------------------------------------------------------+