mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	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…
	
	Add table
		Add a link
		
	
		Reference in a new issue