Итерация потока загрузки InternetReadFile разрывает многобайтовые строки - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь получить строку с сервера, отформатированную в plain/text, в моем приложении MetaTrader 4.Хотя я говорю здесь MT4, я считаю, что мой вопрос не ограничен его контекстом, так как я импортирую InternetReadFile из wininet.dll.

Проблема заключается в том, что когда в ответе присутствуют многобайтовые символы И ответ превышает dwNumberOfBytesToRead, в процессе итерации потока загрузки может произойти сбой ответа.

Это код, который у меня есть сейчас.Обратите внимание, что есть некоторые функции из языков MQL4, но их названия довольно понятны.

int     lReturn[]  = {1};
string  sBuffer    = "";
uchar   arrReceive[];
ArrayResize(arrReceive, BUFSIZ + 1);
strWebPage = "";
int i = 0;

while (TRUE) {
   if (InternetReadFile(hReq, arrReceive, BUFFER_SIZE, lReturn) <= 0 || lReturn[0] == 0) {
      break;
   }

   string strThisRead = CharArrayToString(arrReceive, 0, lReturn[0], CP_UTF8);
   strWebPage = StringConcatenate(strWebPage, strThisRead);
}

Этот код работает хорошо, если BUFFER_SIZE больше, чем ответ, но когда он меньшеиногда многобайтовые символы «обрезаются посередине», что приводит к появлению такой строки:

✓✓✓✓✓??✓?✓✓✓✓

вместо ожидаемого:

✓✓✓✓✓✓✓✓✓✓✓✓
...