Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нужен OpenCL? MQL5 предоставляет такую возможность!
Dmitry Fedoseev
41216
Dmitry Fedoseev 2013.11.13 19:28 

Функция конвертирует UTF-8 в Win-1251

string utf8win1251(string s){
   string out = "";
   int c1;
   bool byte2=false;
      for (int c=0;c<StringLen(s);c++){
         int i=StringGetChar(s,c);
            if (i<=127){
               out=out+StringSubstr(s,c,1);
            }         
            if (byte2){
               int new_c2=(c1&3)*64+(i&63);
               int new_c1=(c1>>2)&5;
               int new_i=new_c1*256+new_c2;
                  if (new_i==1025){
                     int out_i=168;
                  }
                  else{
                     if (new_i==1105){
                        out_i=184; 
                     }
                     else {
                        out_i=new_i-848;
                     }
                  }
               out=out+StringSetChar("",0,out_i);
               byte2=false;
            }
            if((i>>5)==6){
               c1=i;
               byte2=true;
            }
      }
   return (out);
}

Оригинал на php

function utf8win1251($s){
   // взято здесь http://snippets.pp.ru/article/26
    $out = $c1 = "";
    $byte2=false;
    for ($c=0;$c<strlen($s);$c++){
        $i=ord($s[$c]);
        if ($i<=127) $out.=$s[$c];
        if ($byte2){
            $new_c2=($c1&3)*64+($i&63);
            $new_c1=($c1>>2)&5;
            $new_i=$new_c1*256+$new_c2;
            if ($new_i==1025){ $out_i=168; }
            else{
                if ($new_i==1105){
                    $out_i=184; }
                    else {
                        $out_i=$new_i-848;
                    }
            }
            $out.=chr($out_i);
            $byte2=false;
        }
        if (($i>>5)==6) {
            $c1=$i;
            $byte2=true;
        }
    }
    return $out;
}

Тест:

Отдаем строку типа - "Ркономический календарь - Аналитика рынка"

Получаем нормально читаемую строку.

Алексей Тарабанов
7220
Алексей Тарабанов 2013.11.13 20:33  
Спасибо!
Sergey Dzyublik
4621
Sergey Dzyublik 2013.11.13 21:52  

как догадываюсь, в коде применены побитные операции? А где о них можно почитать более детальнее, а то не нашел чего-то на форуме ничего (( ?

Vitalie Postolache
11096
Vitalie Postolache 2013.11.13 22:05  
В учебнике, ещё подробнее в учебниках по С++
Sergey Dzyublik
4621
Sergey Dzyublik 2013.11.13 22:09  
evillive:
В учебнике, ещё подробнее в учебниках по С++


его я видел и раньше, думал может где-то детальнее обговаривалось, ясно, спасибо.

Artyom Trishkin
69026
Artyom Trishkin 2013.11.13 22:14  
ALXIMIKS:


его я видел и раньше, думал может где-то детальнее обговаривалось, ясно, спасибо.

Начать нужно с двоичной системы исчисления.
Рустам
3604
Рустам 2013.11.14 00:29  
для пхп есть iconv($from, $to, $text); вот теперь и для мкл есть. Спасибо.
Vladimir Gomonov
8235
Vladimir Gomonov 2013.11.14 00:52  
Integer:

Функция конвертирует UTF-8 в Win-1251

Оригинал на php

Тест:

Отдаем строку типа - "Ркономический календарь - Аналитика рынка"

Получаем нормально читаемую строку.

И смысл?

2013.11.14 04:49:43.980 MyScripts\MyTests\UTFtoAnsy EURUSD,M1: Relation time = 25.80769230769231
2013.11.14 04:49:43.980 MyScripts\MyTests\UTFtoAnsy EURUSD,M1: Total time to 1000000 StringToCharArray(SUtf,CA); = 78 ms
2013.11.14 04:49:43.980 MyScripts\MyTests\UTFtoAnsy EURUSD,M1: Total time to 1000000 Swin1251=utf8win1251(SUtf); = 2013 ms
2013.11.14 04:49:41.870 MyScripts\MyTests\UTFtoAnsy EURUSD,M1 inputs: total=1000000;

Это код (MT4 build 538):

#property strict
input   int total=1000000;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string SUtf = "Тестовая строка очень длинная (Test String UTF to win1251)";
   string Swin1251 ="";
   uint Start=GetTickCount(), IntTime, S2ATime;
   for(int i=0;i<total;i++)
     {
      Swin1251=utf8win1251(SUtf);
     }
   IntTime=GetTickCount()-Start;  Start=GetTickCount();
   uchar CA[];  ArrayResize(CA,StringLen(SUtf));
   for(int i=0;i<total;i++)
     {
      StringToCharArray(SUtf,CA);
     }
   S2ATime=GetTickCount()-Start;  
   Print("Total time to ",total," Swin1251=utf8win1251(SUtf); = ", IntTime," ms");
   Print("Total time to ",total," StringToCharArray(SUtf,CA); = ", S2ATime," ms");
   Print("Relation time = ", 1.0*IntTime/S2ATime);
  }
//+------------------------------------------------------------------+
string utf8win1251(string s){
   string out = "";
   int c1=0, out_i;
   bool byte2=false;
      for (int c=0;c<StringLen(s);c++){
         int i=StringGetChar(s,c);
            if (i<=127){
               out=out+StringSubstr(s,c,1);
            }         
            if (byte2){
               int new_c2=(c1&3)*64+(i&63);
               int new_c1=(c1>>2)&5;
               int new_i=new_c1*256+new_c2;
                  if (new_i==1025){
                     out_i=168;
                  }
                  else{
                     if (new_i==1105){
                        out_i=184; 
                     }
                     else {
                        out_i=new_i-848;
                     }
                  }
               out=out+StringSetChar("",0,(ushort)out_i);
               byte2=false;
            }
            if((i>>5)==6){
               c1=i;
               byte2=true;
            }
      }
   return (out);
}

Это всё притом что кодовую страницу можно заказать любую, не только win1251. И притом что есть обратное преобразование.

int  StringToCharArray(
   string  text_string,         // строка-источник
   uchar&  array[],             // массив
   int     start=0,             // начальная позиция в массиве
   int     count=-1             // количество символов
   uint    codepage=CP_ACP      // кодовая страница
   );
Курите манул. Вставляет.
Dmitry Fedoseev
41216
Dmitry Fedoseev 2013.11.14 09:07  
MetaDriver:

И смысл?

2013.11.14 04:49:43.980 MyScripts\MyTests\UTFtoAnsy EURUSD,M1: Relation time = 25.80769230769231
2013.11.14 04:49:43.980 MyScripts\MyTests\UTFtoAnsy EURUSD,M1: Total time to 1000000 StringToCharArray(SUtf,CA); = 78 ms
2013.11.14 04:49:43.980 MyScripts\MyTests\UTFtoAnsy EURUSD,M1: Total time to 1000000 Swin1251=utf8win1251(SUtf); = 2013 ms
2013.11.14 04:49:41.870 MyScripts\MyTests\UTFtoAnsy EURUSD,M1 inputs: total=1000000;

Это код (MT4 build 538):

Это всё притом что кодовую страницу можно заказать любую, не только win1251. И притом что есть обратное преобразование.

Курите манул. Вставляет.


Курите сами (особенно свой 538-ой билд). Знаете, господа товарищи с тусовки, ваши реакции уже не удивляют.
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий