forked from suyu/suyu
Fix encode problem On Windows
This commit is contained in:
parent
7e2c0c5371
commit
acfa76aa38
5 changed files with 37 additions and 32 deletions
|
@ -66,7 +66,7 @@ void GameList::ValidateEntry(const QModelIndex& item)
|
||||||
|
|
||||||
if (file_path.isEmpty())
|
if (file_path.isEmpty())
|
||||||
return;
|
return;
|
||||||
std::string std_file_path(file_path.toLocal8Bit());
|
std::string std_file_path(file_path.toStdString());
|
||||||
if (!FileUtil::Exists(std_file_path) || FileUtil::IsDirectory(std_file_path))
|
if (!FileUtil::Exists(std_file_path) || FileUtil::IsDirectory(std_file_path))
|
||||||
return;
|
return;
|
||||||
emit GameChosen(file_path);
|
emit GameChosen(file_path);
|
||||||
|
@ -148,7 +148,7 @@ void GameListWorker::AddFstEntriesToGameList(const std::string& dir_path, bool d
|
||||||
|
|
||||||
emit EntryReady({
|
emit EntryReady({
|
||||||
new GameListItem(QString::fromStdString(Loader::GetFileTypeString(filetype))),
|
new GameListItem(QString::fromStdString(Loader::GetFileTypeString(filetype))),
|
||||||
new GameListItemPath(QString::fromLocal8Bit(physical_name.c_str())),
|
new GameListItemPath(QString::fromStdString(physical_name)),
|
||||||
new GameListItemSize(FileUtil::GetSize(physical_name)),
|
new GameListItemSize(FileUtil::GetSize(physical_name)),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -417,7 +417,7 @@ void GMainWindow::UpdateRecentFiles() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void GMainWindow::OnGameListLoadFile(QString game_path) {
|
void GMainWindow::OnGameListLoadFile(QString game_path) {
|
||||||
BootGame(game_path.toLocal8Bit().data());
|
BootGame(game_path.toStdString());
|
||||||
}
|
}
|
||||||
|
|
||||||
void GMainWindow::OnMenuLoadFile() {
|
void GMainWindow::OnMenuLoadFile() {
|
||||||
|
@ -428,7 +428,7 @@ void GMainWindow::OnMenuLoadFile() {
|
||||||
if (!filename.isEmpty()) {
|
if (!filename.isEmpty()) {
|
||||||
settings.setValue("romsPath", QFileInfo(filename).path());
|
settings.setValue("romsPath", QFileInfo(filename).path());
|
||||||
|
|
||||||
BootGame(filename.toLocal8Bit().data());
|
BootGame(filename.toStdString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -440,7 +440,7 @@ void GMainWindow::OnMenuLoadSymbolMap() {
|
||||||
if (!filename.isEmpty()) {
|
if (!filename.isEmpty()) {
|
||||||
settings.setValue("symbolsPath", QFileInfo(filename).path());
|
settings.setValue("symbolsPath", QFileInfo(filename).path());
|
||||||
|
|
||||||
LoadSymbolMap(filename.toLocal8Bit().data());
|
LoadSymbolMap(filename.toStdString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -461,7 +461,7 @@ void GMainWindow::OnMenuRecentFile() {
|
||||||
QString filename = action->data().toString();
|
QString filename = action->data().toString();
|
||||||
QFileInfo file_info(filename);
|
QFileInfo file_info(filename);
|
||||||
if (file_info.exists()) {
|
if (file_info.exists()) {
|
||||||
BootGame(filename.toLocal8Bit().data());
|
BootGame(filename.toStdString());
|
||||||
} else {
|
} else {
|
||||||
// Display an error message and remove the file from the list.
|
// Display an error message and remove the file from the list.
|
||||||
QMessageBox::information(this, tr("File not found"), tr("File \"%1\" not found").arg(filename));
|
QMessageBox::information(this, tr("File not found"), tr("File \"%1\" not found").arg(filename));
|
||||||
|
|
|
@ -85,7 +85,7 @@ bool Exists(const std::string &filename)
|
||||||
StripTailDirSlashes(copy);
|
StripTailDirSlashes(copy);
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
int result = _tstat64(Common::UTF8ToTStr(copy).c_str(), &file_info);
|
int result = _wstat64(Common::UTF8ToUTF16W(copy).c_str(), &file_info);
|
||||||
#else
|
#else
|
||||||
int result = stat64(copy.c_str(), &file_info);
|
int result = stat64(copy.c_str(), &file_info);
|
||||||
#endif
|
#endif
|
||||||
|
@ -102,7 +102,7 @@ bool IsDirectory(const std::string &filename)
|
||||||
StripTailDirSlashes(copy);
|
StripTailDirSlashes(copy);
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
int result = _tstat64(Common::UTF8ToTStr(copy).c_str(), &file_info);
|
int result = _wstat64(Common::UTF8ToUTF16W(copy).c_str(), &file_info);
|
||||||
#else
|
#else
|
||||||
int result = stat64(copy.c_str(), &file_info);
|
int result = stat64(copy.c_str(), &file_info);
|
||||||
#endif
|
#endif
|
||||||
|
@ -138,7 +138,7 @@ bool Delete(const std::string &filename)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
if (!DeleteFile(Common::UTF8ToTStr(filename).c_str()))
|
if (!DeleteFileW(Common::UTF8ToUTF16W(filename).c_str()))
|
||||||
{
|
{
|
||||||
LOG_ERROR(Common_Filesystem, "DeleteFile failed on %s: %s",
|
LOG_ERROR(Common_Filesystem, "DeleteFile failed on %s: %s",
|
||||||
filename.c_str(), GetLastErrorMsg());
|
filename.c_str(), GetLastErrorMsg());
|
||||||
|
@ -160,7 +160,7 @@ bool CreateDir(const std::string &path)
|
||||||
{
|
{
|
||||||
LOG_TRACE(Common_Filesystem, "directory %s", path.c_str());
|
LOG_TRACE(Common_Filesystem, "directory %s", path.c_str());
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
if (::CreateDirectory(Common::UTF8ToTStr(path).c_str(), nullptr))
|
if (::CreateDirectoryW(Common::UTF8ToUTF16W(path).c_str(), nullptr))
|
||||||
return true;
|
return true;
|
||||||
DWORD error = GetLastError();
|
DWORD error = GetLastError();
|
||||||
if (error == ERROR_ALREADY_EXISTS)
|
if (error == ERROR_ALREADY_EXISTS)
|
||||||
|
@ -241,7 +241,7 @@ bool DeleteDir(const std::string &filename)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
if (::RemoveDirectory(Common::UTF8ToTStr(filename).c_str()))
|
if (::RemoveDirectoryW(Common::UTF8ToUTF16W(filename).c_str()))
|
||||||
return true;
|
return true;
|
||||||
#else
|
#else
|
||||||
if (rmdir(filename.c_str()) == 0)
|
if (rmdir(filename.c_str()) == 0)
|
||||||
|
@ -257,8 +257,13 @@ bool Rename(const std::string &srcFilename, const std::string &destFilename)
|
||||||
{
|
{
|
||||||
LOG_TRACE(Common_Filesystem, "%s --> %s",
|
LOG_TRACE(Common_Filesystem, "%s --> %s",
|
||||||
srcFilename.c_str(), destFilename.c_str());
|
srcFilename.c_str(), destFilename.c_str());
|
||||||
|
#ifdef _WIN32
|
||||||
|
if (_wrename(Common::UTF8ToUTF16W(srcFilename).c_str(), Common::UTF8ToUTF16W(destFilename).c_str()) == 0)
|
||||||
|
return true;
|
||||||
|
#else
|
||||||
if (rename(srcFilename.c_str(), destFilename.c_str()) == 0)
|
if (rename(srcFilename.c_str(), destFilename.c_str()) == 0)
|
||||||
return true;
|
return true;
|
||||||
|
#endif
|
||||||
LOG_ERROR(Common_Filesystem, "failed %s --> %s: %s",
|
LOG_ERROR(Common_Filesystem, "failed %s --> %s: %s",
|
||||||
srcFilename.c_str(), destFilename.c_str(), GetLastErrorMsg());
|
srcFilename.c_str(), destFilename.c_str(), GetLastErrorMsg());
|
||||||
return false;
|
return false;
|
||||||
|
@ -270,7 +275,7 @@ bool Copy(const std::string &srcFilename, const std::string &destFilename)
|
||||||
LOG_TRACE(Common_Filesystem, "%s --> %s",
|
LOG_TRACE(Common_Filesystem, "%s --> %s",
|
||||||
srcFilename.c_str(), destFilename.c_str());
|
srcFilename.c_str(), destFilename.c_str());
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
if (CopyFile(Common::UTF8ToTStr(srcFilename).c_str(), Common::UTF8ToTStr(destFilename).c_str(), FALSE))
|
if (CopyFileW(Common::UTF8ToUTF16W(srcFilename).c_str(), Common::UTF8ToUTF16W(destFilename).c_str(), FALSE))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
LOG_ERROR(Common_Filesystem, "failed %s --> %s: %s",
|
LOG_ERROR(Common_Filesystem, "failed %s --> %s: %s",
|
||||||
|
@ -358,7 +363,7 @@ u64 GetSize(const std::string &filename)
|
||||||
|
|
||||||
struct stat64 buf;
|
struct stat64 buf;
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
if (_tstat64(Common::UTF8ToTStr(filename).c_str(), &buf) == 0)
|
if (_wstat64(Common::UTF8ToUTF16W(filename).c_str(), &buf) == 0)
|
||||||
#else
|
#else
|
||||||
if (stat64(filename.c_str(), &buf) == 0)
|
if (stat64(filename.c_str(), &buf) == 0)
|
||||||
#endif
|
#endif
|
||||||
|
@ -432,16 +437,16 @@ bool ForeachDirectoryEntry(unsigned* num_entries_out, const std::string &directo
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
// Find the first file in the directory.
|
// Find the first file in the directory.
|
||||||
WIN32_FIND_DATA ffd;
|
WIN32_FIND_DATAW ffd;
|
||||||
|
|
||||||
HANDLE handle_find = FindFirstFile(Common::UTF8ToTStr(directory + "\\*").c_str(), &ffd);
|
HANDLE handle_find = FindFirstFileW(Common::UTF8ToUTF16W(directory + "\\*").c_str(), &ffd);
|
||||||
if (handle_find == INVALID_HANDLE_VALUE) {
|
if (handle_find == INVALID_HANDLE_VALUE) {
|
||||||
FindClose(handle_find);
|
FindClose(handle_find);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// windows loop
|
// windows loop
|
||||||
do {
|
do {
|
||||||
const std::string virtual_name(Common::TStrToUTF8(ffd.cFileName));
|
const std::string virtual_name(Common::UTF16ToUTF8(ffd.cFileName));
|
||||||
#else
|
#else
|
||||||
struct dirent dirent, *result = nullptr;
|
struct dirent dirent, *result = nullptr;
|
||||||
|
|
||||||
|
@ -465,7 +470,7 @@ bool ForeachDirectoryEntry(unsigned* num_entries_out, const std::string &directo
|
||||||
found_entries += ret_entries;
|
found_entries += ret_entries;
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
} while (FindNextFile(handle_find, &ffd) != 0);
|
} while (FindNextFileW(handle_find, &ffd) != 0);
|
||||||
FindClose(handle_find);
|
FindClose(handle_find);
|
||||||
#else
|
#else
|
||||||
}
|
}
|
||||||
|
@ -900,7 +905,7 @@ bool IOFile::Open(const std::string& filename, const char openmode[])
|
||||||
{
|
{
|
||||||
Close();
|
Close();
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
_tfopen_s(&m_file, Common::UTF8ToTStr(filename).c_str(), Common::UTF8ToTStr(openmode).c_str());
|
_wfopen_s(&m_file, Common::UTF8ToUTF16W(filename).c_str(), Common::UTF8ToUTF16W(openmode).c_str());
|
||||||
#else
|
#else
|
||||||
m_file = fopen(filename.c_str(), openmode);
|
m_file = fopen(filename.c_str(), openmode);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -320,19 +320,6 @@ std::u16string UTF8ToUTF16(const std::string& input)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::string UTF16ToUTF8(const std::wstring& input)
|
|
||||||
{
|
|
||||||
auto const size = WideCharToMultiByte(CP_UTF8, 0, input.data(), static_cast<int>(input.size()), nullptr, 0, nullptr, nullptr);
|
|
||||||
|
|
||||||
std::string output;
|
|
||||||
output.resize(size);
|
|
||||||
|
|
||||||
if (size == 0 || size != WideCharToMultiByte(CP_UTF8, 0, input.data(), static_cast<int>(input.size()), &output[0], static_cast<int>(output.size()), nullptr, nullptr))
|
|
||||||
output.clear();
|
|
||||||
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
|
|
||||||
static std::wstring CPToUTF16(u32 code_page, const std::string& input)
|
static std::wstring CPToUTF16(u32 code_page, const std::string& input)
|
||||||
{
|
{
|
||||||
auto const size = MultiByteToWideChar(code_page, 0, input.data(), static_cast<int>(input.size()), nullptr, 0);
|
auto const size = MultiByteToWideChar(code_page, 0, input.data(), static_cast<int>(input.size()), nullptr, 0);
|
||||||
|
@ -346,6 +333,19 @@ static std::wstring CPToUTF16(u32 code_page, const std::string& input)
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string UTF16ToUTF8(const std::wstring& input)
|
||||||
|
{
|
||||||
|
auto const size = WideCharToMultiByte(CP_UTF8, 0, input.data(), static_cast<int>(input.size()), nullptr, 0, nullptr, nullptr);
|
||||||
|
|
||||||
|
std::string output;
|
||||||
|
output.resize(size);
|
||||||
|
|
||||||
|
if (size == 0 || size != WideCharToMultiByte(CP_UTF8, 0, input.data(), static_cast<int>(input.size()), &output[0], static_cast<int>(output.size()), nullptr, nullptr))
|
||||||
|
output.clear();
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
std::wstring UTF8ToUTF16W(const std::string &input)
|
std::wstring UTF8ToUTF16W(const std::string &input)
|
||||||
{
|
{
|
||||||
return CPToUTF16(CP_UTF8, input);
|
return CPToUTF16(CP_UTF8, input);
|
||||||
|
|
|
@ -95,7 +95,7 @@ std::string CP1252ToUTF8(const std::string& str);
|
||||||
std::string SHIFTJISToUTF8(const std::string& str);
|
std::string SHIFTJISToUTF8(const std::string& str);
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
std::string UTF16ToUTF8(const std::wstring& input);
|
||||||
std::wstring UTF8ToUTF16W(const std::string& str);
|
std::wstring UTF8ToUTF16W(const std::string& str);
|
||||||
|
|
||||||
#ifdef _UNICODE
|
#ifdef _UNICODE
|
||||||
|
|
Loading…
Reference in a new issue