1 Востаннє редагувалося Betterthanyou (25.01.2021 00:47:32)

Тема: Робота з wchar_t, як записати у файл

Якщо використати той самий код для запису wchar_t у файл що і для char, то у файл не будуть записуватися Unicode символи. Якщо вказати що це бінарний файл і першим символом записати 0xFEFF (Byte order mark), то потрібно ще вказувати буфер, тому що у файл взагалі нічого не запишиться.

Наприклад:
Запис у файл послідовності символів char.
Тут не потрібно вказувати буфер. Запис відбувається за допомогою класу wofstream

char sometext[] = "text";
    char* ref_for_purity_of_experiment = sometext;

    wofstream fs;
    fs.open(
        "t.txt",
        std::wofstream::in |
        std::wofstream::out |
        std::wofstream::app
        );

    fs << ref_for_purity_of_experiment << ";\r\n";

    fs.close();

Запис у файл послідовності символів wchar_t .
Тут потрібно вказувати буфер. Запис відбувається за допомогою класу wofstream

wchar_t sometext[] = L"text";
wchar_t * ref_for_purity_of_experiment = sometext;

wofstream fs;
    fs.open(
        "t.txt",
        std::wofstream::in | 
        std::wofstream::out | 
        std::wofstream::app | 
        std::wofstream::binary
        );

    int arrSize = 128;
    wchar_t *buffer1 = new wchar_t[arrSize];
    fs.rdbuf()->pubsetbuf(buffer1, arrSize);
    fs.put(0xFEFF);

    fs << ref_for_purity_of_experiment << ";\r\n";

Питання: можна записувати wchar_t до файлу без явного вказання буферу, так як звичайний текстовий файл ? Якщо можна, то як ?

std::string - не підходить. Я роблю DLL для сторонньої програми, і якщо я приймаю std::string то програма крашиться

2

Re: Робота з wchar_t, як записати у файл

чи це не дурість писати в ансішний файл юнікод символи?

3 Востаннє редагувалося Betterthanyou (25.01.2021 00:42:46)

Re: Робота з wchar_t, як записати у файл

ur_naz написав:

чи це не дурість писати в ансішний файл юнікод символи?

Не впевнений що я вас правильно розумію. Але файл не може бути "ансішний", я маю на увазі що файл завжди бінарний, а як ви його відкриєте, від того залежить що ви там побачите.

В програмі яка відкриває файл потрібно вказати кодування файлу... наприклад у Ворді, тоді ви побачите юнікод символи (або ті, які ви вкажете)

4

Re: Робота з wchar_t, як записати у файл

написано

"t.txt",

5 Востаннє редагувалося wander (25.01.2021 01:45:30)

Re: Робота з wchar_t, як записати у файл

Betterthanyou написав:

Питання: можна записувати wchar_t до файлу без явного вказання буферу, так як звичайний текстовий файл ? Якщо можна, то як ?

Віндовс працює з utf-16, якщо вам підходить працювати з цим кодуванням, то можна (і без зайвих присідань). Необхідно лише відкрити файл у потрібному кодуванні (по дефолту це вроді UTF-8).

FILE* fout = _wfopen(L"Назва Файлу.txt", L"wt+,ccs=UTF-16LE");
std::wofstream file{ fout };
if (file.is_open())
{
    file << L"У всякого своя доля і свій шлях широкий." << std::endl;
    file.close();
}
else std::wcout << "Unable to open file.";
Подякували: Betterthanyou1

6

Re: Робота з wchar_t, як записати у файл

Використовуйте звичайні функції для char/ASCII/UTF-8, функції з w - для wchar_t/UTF-16BE (у Windows)/UTF-32BE (Linux). Не змішуйте їх без явного перетворення і все буде гаразд. BOM потрібен для розрізнення кодування, і автоматично не працює - ви маєте самі перевіряти, чи є там BOM і якого кодування.

Подякували: leofun011