LINUX.ORG.RU

poppler + локаль = ♥

 , , ,


0

1

Есть проблема с попплером под оффтопиком. Если из русского оффтопика попытаться конвертировать при помощи pdftocairo или напрямую из биндинга к qt4 Poppler::Document::load(...) файл, в имени которого немецкий умляут, то получаю «„Error: Couldn't open file 'D:\Marz2014.pdf'“ Из оффтопика с немецкой локалью открывается нормально, конвертирует хорошо.

В какую сторону копать, как решить? Как указать попплеру локаль или что?

Deleted

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

смотри исходники

Poppler::Document::load(...)

если там внизу не CreateFileW (unicode-версия CreateFile), то по большому счету нифига ты не сделаешь

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

Это выхлоп попплера. Название файла März2014.pdf

Deleted
()
Ответ на: комментарий от dib2

Внизу есть развилка на CreateFileW и CreateFile.

Попробовал еще раз - если передавать файл в Poppler::Document::load через QFileDialog::getOpenFile то работает, если напрямую указывать путь, то не работает. Как параметр через QProcess для вызова pdftocairo никак не работает - но эта проблема касается только оффтопика.

Буду копать дальше, спасибо.

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

Только если написать свою мини-утилитку и положить исходники рядом с ней :)

ага, он еще и GPL (!LGPL).
собственно, почему бы и нет? будет у тебя свой pdftocairo из 10 строчек. исходники ты обязан давать по запросу (выложи в паблик и делов)

а по GPL - waker все верно сказал.

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

Не, не сработало. Всё равно при передаче файла с умляутами через параметры в свою утилиту они теряются по дороге и получается то же самое.

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

setlocale. очевидно же ...

А вообще самый первый костыль, которые я в таком случае юзал - короткие пути. Но это костыль, да.

Кстати, а что Poppler::Document::load не умеет юникод чтоль?

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

Умеет. Но где-то в процессе передачи из другого процесса символы теряются

Отправляющая сторона:

    SetConsoleCP(CP_UTF8);
    SetConsoleOutputCP(CP_UTF8);
    setlocale(LC_ALL, "ru_RU.UTF-8");

    QStringList arguments;
    arguments << pathToFile;
    pdftocairoProcess.start(pdtocairoPath, arguments);

мой pdftocairo

    char * filePath = argv[1];
    Poppler::Document * doc = Poppler::Document::load(QString(filePath));

Не работает. Пробовал и с pathToFile.toUtf8(), а в pdftocairo QString::fromUtf8(filePath), всё равно не работает.

выводит или

can't load Marz2014.pdf
или (с toUtf8())
can't load MA¤rz20141.pdf" 

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

мой pdftocairo

Ну и чегож ты хотел? Тыж этим способом поломал весь путь.

Ты либо пользуй wchar_t argv для венды в этом случае, либо, если не можешь, пользуй GetComandLineW/CommandLineToArgvW, пользуй уже их как параметры.

Либо при передаче передавай путь как _мультибайт_ UTF8, а в принимающем процессе конверти в _юникод_.

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

Фух, разобрался, спасибо большое.

Посылаю аргумент:

    arguments << pathToFile;

Получаю:

    LPCWSTRpCmdLine = GetCommandLineЦ();
    QString argvString = QString::fromUtf16(pCmdLine);

Усё зроблена

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

Даже так

LPCWSTR pCmdLine = GetCommandLineW();
LPWSTR * pArgwW = CommandLineToArgvW(pCmdLine,&argc);
QString filePath = QString::fromUtf16(pArgwW[1]);
Deleted
()
Последнее исправление: nCux (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.