rtl::OUString не читает Русский файл на Linux

Автор Denis8388, 17 июня 2022, 14:01

0 Пользователи и 1 гость просматривают эту тему.

Denis8388

 Я установил либрофис sdk. Конвертация из doc в pdf работает отлично на винде, но на линуксе идет краш программы, где пытается открыть док файл с русским названием (на английском конвертирует норм). Название хранится в типе *char (хранится правильно), но когда пытаюсь преобразовать в OUString, происходит краш. Сталкивался ли кто с такой проблемой?

ошибка в консоли "terminate called after throwing an instance of 'com::sun::star::lang::IllegalArgumentException'"

mikekaganski

Цитата: Denis8388 от 17 июня 2022, 14:01когда пытаюсь преобразовать в OUString, происходит краш

... как именно преобразуете? И в какой кодировке у Вас имена файлов?
С уважением,
Михаил Каганский

Denis8388

для винды работает так
OUString sDocUrl;

osl::FileBase::getFileURLFromSystemPath(OUString(g_currentPathFile.toStdWString().c_str()), sDocUrl);


Sequence<PropertyValue> loadProps(2);
loadProps[0].Name = OUString::createFromAscii("Hidden");
loadProps[0].Value = Any(true);
loadProps[1].Name = OUString::createFromAscii("UpdateDocMode");
loadProps[1].Value = Any(sal_Int16(com::sun::star::document::UpdateDocMode::FULL_UPDATE));
Reference <XComponent> xWriterComponent = xComponentLoader->loadComponentFromURL(sDocUrl, OUString("_blank"), 0, loadProps);
Reference <XTextDocument> xTextDocument(xWriterComponent, UNO_QUERY);


но на линуксе компилятор ругает на ".toStdWString().c_str()"

решил я так
OUString sDocUrl;

osl::FileBase::getFileURLFromSystemPath(OUString::createFromAscii(g_currentPathFile.toLocal8Bit().data()), sDocUrl);


Sequence<PropertyValue> loadProps(2);
loadProps[0].Name = OUString::createFromAscii("Hidden");
loadProps[0].Value = Any(true);
loadProps[1].Name = OUString::createFromAscii("UpdateDocMode");
loadProps[1].Value = Any(sal_Int16(com::sun::star::document::UpdateDocMode::FULL_UPDATE));
Reference <XComponent> xWriterComponent = xComponentLoader->loadComponentFromURL(sDocUrl, OUString("_blank"), 0, loadProps);
Reference <XTextDocument> xTextDocument(xWriterComponent, UNO_QUERY);


на английском работает конвертация,а на рус нет, краш. Права файлу дал все максимальные, не помогло 

Denis8388

я делал даже еще проще, тупо путь до файла указал вместо "g_currentPathFile.toLocal8Bit().data()"

mikekaganski

Естественно, он падает. createFromAscii работает только для Ascii (коды 0-127).

Вы могли бы воспользоваться QString::toUtf8, и затем преобразовать в OUString с помощью конструктора, принимающего char*:

auto filePathUtf8 = g_currentPathFile.toUtf8();
rtl::OUString s(filePathUtf8.data(), filePathUtf8.size(), RTL_TEXTENCODING_UTF8);
С уважением,
Михаил Каганский

mikekaganski

#5
Или даже проще - у QString внутреннее представление уже UTF-16, также как и у OUString. Достаточно сделать

osl::FileBase::getFileURLFromSystemPath(rtl::OUString(reinterpret_cast<const sal_Unicode*>(g_currentPathFile.utf16())), sDocUrl);
С уважением,
Михаил Каганский

Denis8388

Спасибо большое, это помогло))
Но я вроде даже в настройках линукса установил, чтоб понимал Ascii. Но это не помогло. Я сам не давно перешел на линукс (заставили). В итоге, линукс понимает русский в кодировке utf8?

mikekaganski

Линукс понимает всё. Но это не имеет значения к данному случаю. Потому что "понимать" - это слишком широкое понятие.

Вопрос не в том, что понимает Линукс, а в том, как рассказать процедуре преобразования, из какой кодировки ей надо привести к UTF-16 (которая внутри OUString). Потому что никакие Ваши системные настройки не влияют на функцию createFromAscii. Можно использовать системную кодировку вместо Unicode (но всё равно нужно будет пользоваться указанным конструктором, принимающим char*), но тогда оно перестанет работать, как только Вы запуститесь на Linux с кодировкой KOI8, и попробуете открыть файл с иероглифами в имени.

А код, который я представил, будет работать всегда, и можно использовать и на Windows. Ну, почти всегда: ведь Linux позволяет имена файлов вообще использовать бинарные...
С уважением,
Михаил Каганский

sokol92

#8
Про Unicode и другие кодировки в Linux.

Кстати, для MS Windows код из #2 может корректно работать с русскими буквами только в случае, если кодовой страницей по умолчанию является Windows-1251.
Владимир.

mikekaganski

Цитата: sokol92 от 17 июня 2022, 15:50для MS Windows код из #2 может корректно работать с русскими буквами только в случае, если кодовой страницей по умолчанию является Windows-1251.

Вы про первый или про второй фрагмент из #2? Потому что первый будет работать всегда, а второй - никогда для не-Ascii.
С уважением,
Михаил Каганский

sokol92

Второй. Написал "на автомате", не посмотрев внимательно.  :(
Владимир.