Jak piszę program w C++, to w pierwszej kolejności korzystam z tego, co daje biblioteka standardowa, w drugiej kolejności to, co daje Qt.
Do testów zrobiłem prostą aplikację zawierająca jeden przycisk i jedno pole tekstowe. Chodzi o otwarcie pliku tekstowego będącego w katalogu z aplikacją.
W systemie Windows 8, jak aplikacja jest w katalogu zawierającym "polskie znaki" w nazwie, to ona nie otwiera pliku. Jak nie ma polskich znaków w nazwie, to plik prawidłowo otwiera i wyświetla zawartość tego pliku. Jednakże, nazwę katalogu wyświetla prawidłowo. W systemie Ubuntu Linux 20.04 nie ma tego problemu i aplikacja czyta plik również wtedy, gdy w nazwie katalogu są polskie znaki.
#include <QMainWindow>
#include <iostream>
#include <fstream>
#include <QDir>
#include <sstream>
void MainWindow::on_pushButton_clicked()
{
std::string AppDir = QDir::currentPath().toUtf8().constData();
QString X = "Error ";
std::string FN = "\\test.txt";
FN = AppDir + FN;
std::fstream Fx(FN, std::ios::in);
if (Fx.is_open())
{
X = "Good ";
std::stringstream SS;
SS << Fx.rdbuf();
Fx.close();
std::string Sx = "[" + SS.str() + "]";
X = X + QString::fromUtf8(Sx.c_str());
}
ui->lineEdit->setText(X + QString::fromUtf8(AppDir.c_str()));
}
Konwersja między QString i std::string zastosowana jest taką, jaką stosuję od lat i bez problemu radzi sobie z polskimi znakami w systemie Windows.
Pewnie w tym przypadku można próbować podawać samą nazwę pliku, ale w jaki sposób podać katalog z polskimi znakami?
Zrobiłem też taki test, jak w nazwie pliku nie ma polskich znaków, to jest dobrze, a jak są polskie znaki, to na Windows nie czyta, na Linux czyta, jednak w obu systemach nazwę pliku w polu tekstowym pokazuje prawidłowo:
void MainWindow::on_pushButton_2_clicked()
{
QString X = "Error ";
std::string FN = "C:\\Users\\VM\\Desktop\\aą.txt";
std::fstream Fx(FN, std::ios::in);
if (Fx.is_open())
{
X = "Good ";
std::stringstream SS;
SS << Fx.rdbuf();
Fx.close();
std::string Sx = "[" + SS.str() + "]";
X = X + QString::fromUtf8(Sx.c_str());
}
ui->lineEdit->setText(X + QString::fromUtf8(FN.c_str()));
}
Powyższy kod jest specjalnie napisany w celu zobrazowania problemu. Generalnie, chodzi o odczyt i zapis plików tekstowych linia po linii.