Re[6]: Приложения под Windows все еще продаются?
От: drVanо Россия https://vmpsoft.com
Дата: 27.02.19 09:44
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Почему не сразу в UTF-16? Тогда, как минимум, под виндой не нужна конвертация, и вся обработка идет без закидонов. А ежели куда надо выгрузить в UTF-8, то это всяко проще, чем всю обработку на него затачивать.


Потому что UTF8 — родная кодировка для OSX/Linux и для вызовов API никакая конвертация не требуется.

P.S. Например вот так:
namespace os
{
...
HANDLE FileCreate(const char *name, uint32_t mode)
{
#ifdef VMP_GNU
    int flags;

    switch (FILE_OPEN_MODE(mode)) {
    case fmOpenRead:
        flags = O_RDONLY;
        break;
    case fmOpenWrite:
        flags = O_WRONLY | O_TRUNC;
        break;
    case fmOpenReadWrite:
        flags = O_RDWR;
        break;
    default:
        return INVALID_HANDLE_VALUE;
    }

    if (mode & fmCreate)
        flags |= (O_CREAT | O_TRUNC);

    return reinterpret_cast<HANDLE>(open(name, flags, (flags & O_CREAT) ? S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH : 0));
#else
    uint32_t desired_access, share_mode;

    switch (FILE_OPEN_MODE(mode)) {
    case fmOpenRead:
        desired_access = GENERIC_READ;
        break;
    case fmOpenWrite:
        desired_access = GENERIC_WRITE;
        break;
    case fmOpenReadWrite:
        desired_access = GENERIC_WRITE | GENERIC_READ;
        break;
    default:
        return INVALID_HANDLE_VALUE;
    }

    switch (FILE_SHARE_MODE(mode)) {
    case fmShareExclusive:
        share_mode = 0;
        break;
    case fmShareDenyWrite:
        share_mode = FILE_SHARE_READ;
        break;
    case fmShareDenyRead:
        share_mode = FILE_SHARE_WRITE;
        break;
    case fmShareDenyNone:
        share_mode = FILE_SHARE_READ | FILE_SHARE_WRITE;
        break;
    default:
        return INVALID_HANDLE_VALUE;
    }

    return CreateFileW(FromUTF8(name).c_str(), desired_access, share_mode, NULL, (mode & fmCreate) ? CREATE_ALWAYS : OPEN_EXISTING, 0, NULL);
#endif
}
Отредактировано 27.02.2019 9:51 drVanо . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.