Не сохраняются кириллица в файл с CP_UTF8

 
void OnStart() {
    uint numSavedBytes = 0;
    string path = "temp.txt";
    string text = "раз два три"; // не сохраняет
    //string text = "one two three"; // сохраняет
    int file = FileOpen(path, FILE_WRITE|FILE_ANSI, '\t', CP_UTF8);
    if(file != INVALID_HANDLE) {
        numSavedBytes = FileWriteString(file, text);
        FileClose(file);
        Print("numSavedBytes=", numSavedBytes, " text=", text);
    } else {
        Print("GetLastError = ", GetLastError());
    }    
}

Подскажите, плз, решение

 
Malik Arykov:
FileOpen

Не все флаги заполнили

https://www.mql5.com/ru/docs/constants/io_constants/fileflags

Документация по MQL5: Константы, перечисления и структуры / Константы ввода/вывода / Флаги открытия файлов
Документация по MQL5: Константы, перечисления и структуры / Константы ввода/вывода / Флаги открытия файлов
  • www.mql5.com
Флаги открытия файлов - Константы ввода/вывода - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Vitaly Muzichenko #:

Не все флаги заполнили

https://www.mql5.com/ru/docs/constants/io_constants/fileflags

Какие требуются?

void OnStart()
  {
   //int file = FileOpen("testfile_rus.txt", FILE_READ|FILE_WRITE|FILE_TXT|FILE_ANSI|FILE_SHARE_READ, '\t', CP_UTF8); //  - 1 -
   //int file = FileOpen("testfile_rus.txt", FILE_READ|FILE_WRITE|FILE_TXT|FILE_ANSI|FILE_SHARE_READ);                //  - 2 -
   int file = FileOpen("testfile_rus.txt", FILE_READ|FILE_WRITE|FILE_TXT|FILE_SHARE_READ);                            //  - 3 -

   if(file!=INVALID_HANDLE)
     {
      FileWriteString(file, "Русский текст!");
      FileClose(file);
     }
  }

Первый вариант даёт пустой файл.

Второй - файл со строкой (HEX)

00000000 3F 3F 3F 3F │ 3F 3F 3F 203F 3F 3F 3F │ 3F 21                                                                                            ??????? ?????!

Третий - UTF-16, малополезный под Линуксом

Ubuntu-18.04, Wine 8.5, MT5 3802

 
JRandomTrader #:

Какие требуются?

Первый вариант даёт пустой файл.

Второй - файл со строкой (HEX)

Третий - UTF-16, малополезный под Линуксом

Ubuntu-18.04, Wine 8.5, MT5 3802

FILE_UNICODE

64

Строки типа UNICODE (двухбайтовые символы). Флаг используется при открытии файлов

 
Alexey Viktorov #:

FILE_UNICODE

64

Строки типа UNICODE (двухбайтовые символы). Флаг используется при открытии файлов

Это тоже даёт UTF-16.

 
Print(IntegerToString(TerminalInfoInteger(TERMINAL_CODEPAGE)));

даёт 1251

 
Как создать и сформировать CSV - файл в формате кодирования UTF - 8, спасибо!
Как создать и сформировать CSV - файл в формате кодирования UTF - 8, спасибо!
  • 2023.04.28
  • www.mql5.com
Когда я использовал функцию FileOpen для создания CSV - файлов и записи данных, я обнаружил, что в конечном итоге сформированный файл был кодирован...
 

Так - пустой файл получается.

Удаётся сохранить в UTF-16 или в 1251. UTF-8 - никак.
 
JRandomTrader #:
FileOpen("testfile_rus.txt", FILE_READ|FILE_WRITE|FILE_TXT|FILE_SHARE_READ);       
FILE_ANSI обязателен
 

Все ясно, фиксируем баг/фичу в build 3802 09.06.2023.

Неужели в тестах перед выпуском нет проверки: сохранил в файл, прочитал, если совпало, то тест прошел, иначе нет.

 
Vitaly Muzichenko #:
FILE_ANSI обязателен

Да, и в случае UTF-8 получаем пустой файл. Для 1251 - работает.