LINUX.ORG.RU

fstream на оффтопике

 , ,


0

1

Добрый день!

Есть файл с кириллицей в имени, c++, MinGW, Qt5 и Windows в виртуалке.

Надо считать его содержимое используя ifstream. С латиницей работает чудесно, под онтопиком работает чудесно. Ссаные вендопроблемы!

Тестовый сниппет: http://paste.omsklug.com/5208/

Решение

Рабочий сниппет: http://paste.omsklug.com/5210/

Зависимости: вот это.

★★★

Последнее исправление: BruteForce (всего исправлений: 1)

Консоль?

ну так приведи все к локали текущей. Или консоль сделай не досовой кодировки. Этож венда. вот тебе кривой лисапед. А в с++11 уже есть изкоробки вроде.

    static std::string w2mb( LPCWSTR src, UINT CodePage = CP_ACP )
    {
        int cch = WideCharToMultiByte( CodePage, 0, src, -1, 0, 0, 0, 0 );
        if( 0 != cch ) {
            std::vector<char> data;
            data.resize( cch + 1 );

            WideCharToMultiByte( CodePage, 0, src, -1, &data[0], (DWORD)data.size( ), 0, 0 );
            return &data.front( );
        }
        return "";
    }

    static std::wstring mb2w( LPCSTR src, UINT CodePage = CP_ACP )
    {
        int cch = MultiByteToWideChar( CodePage, 0, src, -1, 0, 0 );
        if( 0 != cch ) {
            std::vector<wchar_t> data;

            data.resize( cch + 1 );
            MultiByteToWideChar( CodePage, 0, src, -1,  &data[0], (DWORD)data.size( ));
            return &data.front( );
        }

        return L"";
    }
anonymous
()
Ответ на: комментарий от BruteForce

Низя, на Qt только гуйня, зачем оно мне в уже готовом бэке?

А зачем вы используете русские имена файлов, если это бэкэнд, и юзеру не видно?

UVV ★★★★★
()
Ответ на: комментарий от UVV

А зачем вы используете русские имена файлов, если это бэкэнд, и юзеру не видно?

Юзеры, к сожалению, используют.

BruteForce ★★★
() автор топика
Ответ на: комментарий от UVV

Это виртуальное разделение.

ПО не задумывалось для онтопика, GUI приделывать тоже не предпологалось.

BruteForce ★★★
() автор топика
Ответ на: комментарий от BruteForce

Проблема в том, что винда UTF-16, поэтому либо Qt, раз разделение виртуальное, либо пробуй как аноним написал выше. Можешь ещё вот тут посмотреть http://stackoverflow.com/questions/30829364/open-utf8-encoded-filename-in-c-w...

UVV ★★★★★
()
Ответ на: комментарий от UVV

Грусть, думаю пойду по пути рефакторинга.

BruteForce ★★★
() автор топика
Ответ на: комментарий от utf8nowhere

(boost::)nowide

Да, я читал это, но по религиозным причинам не потащу ошметки буст туда, где уже укоренились ошметки Qt.

utf8nowhere

Хих)

BruteForce ★★★
() автор топика
Ответ на: комментарий от BruteForce

boost скорее дополняет STL, чем Qt. Но это на любителя, да. В backend я б его включил, но это имхо.

UVV ★★★★★
()

Читаешь ввод в вектор байт. В зависимости от кодировки перекодируешь в то что тебе нужно каким нибудь codecvt.

invy ★★★★★
()
Ответ на: комментарий от anonymous

Я автор статей, текстов и постов

Ты автор этой Cppcms?

Нет. Ещё я не автор манифеста «UTF-8 Everywhere». И многого другого.

utf8nowhere ★★★
()
Ответ на: комментарий от BruteForce

Зависимости: вот это.

В какой среде и как это под винду собрать? Пробовал в msys2 mingw64, cmake жалуется на неизвестную конфигурацию, но генерирует Makefile. При сборке валится на линковке тестов.

anonymous
()
Ответ на: комментарий от BruteForce

Или ты просто скопировал .h-файлы и .cpp-файл в проект?

anonymous
()
Ответ на: комментарий от UVV

Проблема в том, что винда UTF-16

Это не проблема, это wchar_t такой. А в оффтопном приложениии может быть в зависимости от настроек проекта MultiByte character set, Unicode charachter set и т.д. А на входе может быть чоугодно: в локали UTF-8 c BOM и без — энивей, под оффтопиком или под онтопиком There Ain't No Such Thing As Plain Text :) Аналогично под онтопиком wchar_t UTF-32 — и UTF-8 надо в него таки конвертить и обратно, иначе можно получать от частично читабельной кашки (в части совпадения UTF-8 с ASCII) до совершенно нечитабельной: «множество приложений Linux делают „глупые предположения“, что UTF-8 означает, что они не должны ничего менять, чтобы сделать их код работать правильно w.r.t. стандарт Unicode, и по-прежнему можете использовать обычный char * S везде и не обращать внимание на вещи» (c) Пользуешься внутре L"Литераламе" или wchar_t — не делай предположений о входном тексте, если не сам его генерил :)

slackwarrior ★★★★★
()
Ответ на: комментарий от UVV

В этом и фишка

Это не фишка, это предпосылки для багов от ручного байтоебства, если им не пользуются, там где надо :)

slackwarrior ★★★★★
()
Ответ на: комментарий от UVV

Именно в этом и заключается профанация: наивное предположение что это «хватает в 90% случаев» — тупо отложенный выстрел в ногу и «таймбомб» (это даже хуже чем преступление, это ошибка чем буфер

char buf[100500];
из раньших примеров «царского кода»).

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 2)
Ответ на: комментарий от UVV

Хорошо это или плохо - хз.

Само существование wchar_t — это величайшая катастрофа. wchar_t это главный экспонат в IT Hall of Shame.

utf8nowhere ★★★
()
Ответ на: комментарий от utf8nowhere

Пф... Использование std::string или велосипедов ничем не лучше :) Обычное игнорирование граблей до первого попадания на них желательно с мат. ответственностью :)

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 1)
Ответ на: комментарий от utf8nowhere

Мистер упоротый красноглазик, аргументов кроме вашего личного синдрома пингвиненка у вас нет :)

slackwarrior ★★★★★
()
Ответ на: комментарий от slackwarrior

Обычное игнорирование граблей до первого попадания на них

— это типичный вендоподход. До сих пор куча «unicode-aware» софта предполагает, что «2 байта это символ».

utf8nowhere ★★★
()
Ответ на: комментарий от utf8nowhere

Нет. Это типичное высокомерие дезориентированных в детстве «люникс-погромистов» «эффективных кодеров»(ТМ), которым не кому было ебнуть по рукам стальной линейкой«сделать код ревью ВЫТЕКЛИ ГЛАЗА КРОВЬ КИШКИ» :) — поэтому они на зло мамке морозят ушипублично и не стесняясь голосуют за прибивание гвоздями, хардкод буферов, предположения о других системах и условиях использования кода (внезапная писанина логов внутрь установочного пакета на маке :)), велосипеды для манипуляций с мультибайт-последовательностями или игнор их природы внутри std::string («ой, какой-то мусор в буфере с паролем и длина какая-то странная»), подбор решения методом тыка и пр. дурные привычки под соусом «все так делают» и экстраполяция сложившегося подхода «хорошо слежавшегося говна» в будущее пока Леннарт не найдет фатальный недостаток :)

slackwarrior ★★★★★
()
Ответ на: комментарий от slackwarrior

Это типичное высокомерие дезориентированных в детстве «люникс-погромистов» «эффективных кодеров»

Выражаю вам искренние соболезнования в связи дезориентированным детством. Уверен, у вас ещё есть шанс перестать быть «эффективным кодером».

utf8nowhere ★★★
()
Ответ на: комментарий от anonymous

А, там же неявное конструирование строки из char*, не увидел сначала.

Softwayer ★★
()
Ответ на: комментарий от anonymous

Качаешь архивчик, распаковываешь. Открываешь cmd.exe и идешь в эту директорию. Выполняешь cmake.exe и опосля mingw32-make (разумеется у тебя должен иметься и CMake и конпелятор). На выходе получается libnowide.a.

В свой проект втыкаешь вот ето:

if(WIN32)
    # nowide
    include_directories("C:/nowide_standalone")
    add_library(nowide STATIC IMPORTED)
    set_target_properties(nowide PROPERTIES IMPORTED_LOCATION "C:/nowide_standalone/libnowide.a")
    target_link_libraries(${PROJECT_NAME} nowide)
endif(WIN32)

Вуаля!

BruteForce ★★★
() автор топика
Ответ на: комментарий от utf8nowhere

Из UTF-8 емулятора терминала от баша вроде работает, но мне это не надо, это не мой кейс.

BruteForce ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.