как догадываюсь, в коде применены побитные операции? А где о них можно почитать более детальнее, а то не нашел чего-то на форуме ничего (( ?
его я видел и раньше, думал может где-то детальнее обговаривалось, ясно, спасибо.
Функция конвертирует 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 // кодовая страница );Курите манул. Вставляет.
И смысл?
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-ой билд). Знаете, господа товарищи с тусовки, ваши реакции уже не удивляют.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Функция конвертирует UTF-8 в Win-1251
Оригинал на php
Тест:
Отдаем строку типа - "Ркономический календарь - Аналитика рынка"
Получаем нормально читаемую строку.