crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> linux. Программа не находит файл, если в пути к нему есть русские буквы, как лечить?
Rocky
  опции профиля:
сообщение 24.11.2010, 10:22
Сообщение #1


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Всем привет! Кто-нибдь знает, как решается проблема, если путь до самой программы, или пути к открываемым файлам, содержат русские буквы... В винде все работает.. а в линуксе нифига (
Вот например открываю текстовый файл
const QString sPath = qApp->applicationDirPath() + qApp->tr("/Methodics/%1").arg(oMethodic.sMethodicName);
#ifdef UNICODE
std::wstring sFileNameStd1 = sBuf1.toStdWString();
#else
std::string sFileNameStd1 = sBuf1.toStdString();
#endif

//открываем файл
std::ifstream file1(sFileNameStd1.c_str(), std::ios::in);
if (file1)
{
.....
}


oMethodic.sMethodicName содержит русское слово =), которое абсолютно нормально отображается в QMessageBox. В то же время внутрь if (file1) я не попадаю...

UPD
Да, сам путь и файл естественно существует.

Сообщение отредактировал Rocky - 24.11.2010, 10:23
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 24.11.2010, 10:31
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


А в main установлены всякие?
QTextCodec::setCodecForTr(...)
QTextCodec::setCodecForCString(...)

А define UNICODE определен?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 24.11.2010, 13:38
Сообщение #3


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Цитата(BRE @ 24.11.2010, 10:31) *
А в main установлены всякие?
QTextCodec::setCodecForTr(...)
QTextCodec::setCodecForCString(...)

да. Вот
QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForTr());

Цитата(BRE @ 24.11.2010, 10:31) *
А define UNICODE определен?

Нет, это для MS Visual Studio в винде... Под linux (в Qt Creator) не определяю.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 24.11.2010, 14:12
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(Rocky @ 24.11.2010, 13:38) *
да. Вот

А какая локаль используется в linux? Windows-1251? ;)

Посмотри, что находиться в sFileNameStd1, какой файл ты пытаешься открыть.
Почитай что делают эти магические методы в QTextCodec и для каких преобразований строк.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 24.11.2010, 14:22
Сообщение #5


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


ыыыыы... utf-8 там.... это из-за этого да? блин, вечером попробую тогда исправить. Спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 25.11.2010, 10:11
Сообщение #6


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Ну фиг знает. Исправил. Сделал так

#ifdef Q_OS_WIN
    QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));
#else
    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
#endif

    QTextCodec::setCodecForCStrings(QTextCodec::codecForTr());



Но теперь проблемы с загрузкой русского текста из текстовых файлов... Вчера пол-вечера и пол-ночи ковырялся и понял что эти кодеки, пожалуй, самое непонятное что есть в Qt для меня... (само собой читал ассистант).


Вот все исходники программы сохранены в UTF-8. В main-е стоит то что выше привел. Вся информация, которая отображается во всяких QMessageBox находится в одном файле, тоже в кодировке UTF-8. В таком виде:
m_roMessages[eQuestionDeleteAllSpectrs3] = QString::fromUtf8("Подтверждаете удаление 
выделенных спектров с жесткого диска?");

Проблем никаких нет, все отображается нормально как в windows, так и в linux.

Проблемы начинаются при загрузке текста из файла (я использую стандартные потоки ввода/вывода). Вот файл пишу и считываю так:
std::ostream& operator << (std::ostream& os, const TUser& rhs)
{
    const QString sText = ":" + QString::number(rhs.nID).toAscii().toHex() + ":" +
rhs.sFirstName.toAscii().toHex() + ":" + rhs.sSecondName.toAscii().toHex() + ":" +
rhs.sSurName.toAscii().toHex() + ":" + rhs.sPasswd.toStdString().c_str() + ":" +
rhs.sGroup.toAscii().toHex() + ":\n";

    os.write(sText.toStdString().c_str(), sText.length());
    return os;
}

std::istream& operator >> (std::istream& is, TUser& rhs)
{
    QByteArray oText;
    const int nBufSize = 128;

    char szBuf[nBufSize];
    is.getline(szBuf, nBufSize, ':');
    is.getline(szBuf, nBufSize, ':'); oText = QByteArray::fromHex(szBuf); rhs.nID = QString(oText).toInt();
    is.getline(szBuf, nBufSize, ':'); oText = QByteArray::fromHex(szBuf); rhs.sFirstName = QString::fromAscii(oText);
    is.getline(szBuf, nBufSize, ':'); oText = QByteArray::fromHex(szBuf); rhs.sSecondName = QString::fromAscii(oText);
    is.getline(szBuf, nBufSize, ':'); oText = QByteArray::fromHex(szBuf); rhs.sSurName = QString::fromAscii(oText);
    is.getline(szBuf, nBufSize, ':'); rhs.sPasswd = szBuf;
    is.getline(szBuf, nBufSize, ':'); oText = QByteArray::fromHex(szBuf); rhs.sGroup = QString::fromAscii(oText);
    return is;
}


Файл как показывает виндусовский notepad, в кодировке ANSI. В windows все нормально, в linux - кракозябры... Что не так подскажите пожалуйста? ((

---
UPD

В то же время, если таким вот образом писать файл с русским текстом чисто в линуксе, то все нормально и пишется, и читается потом. Видимо, не получится таскать с собой все сохраненные файлы программы из одной ОС в другую (

Сообщение отредактировал Rocky - 25.11.2010, 17:16
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


5 чел. читают эту тему (гостей: 5, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.12.2024, 18:42