From f8e1aa18449cb5bbcd2f8935d300631f90615760 Mon Sep 17 00:00:00 2001 From: dreamsourcelabTAI Date: Thu, 23 Jun 2022 19:02:34 +0800 Subject: [PATCH] fix: can't load unicode file path on window --- DSView/pv/mainwindow.cpp | 19 +++++++++---------- DSView/pv/utility/path.cpp | 11 ----------- common/minizip/ioapi.c | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 21 deletions(-) diff --git a/DSView/pv/mainwindow.cpp b/DSView/pv/mainwindow.cpp index ec6cacd6..91063650 100644 --- a/DSView/pv/mainwindow.cpp +++ b/DSView/pv/mainwindow.cpp @@ -440,20 +440,19 @@ void MainWindow::update_device_list() //load specified file name from application startup param if (_bFirstLoad){ _bFirstLoad = false; - - if (AppControl::Instance()->_open_file_name != ""){ - QString opf(QString::fromUtf8(AppControl::Instance()->_open_file_name.c_str())); - QFile fpath; + + QString ldFileName(AppControl::Instance()->_open_file_name.c_str()); - if (fpath.exists(opf)){ - qDebug()<<"auto load file:"< -#endif - namespace pv::path { std::string ConvertPath(QString fileName) { -#ifdef _WIN32 - QTextCodec *code = QTextCodec::codecForName("GB2312"); - if (code != NULL) - { - return code->fromUnicode(fileName).data(); - } -#endif return fileName.toUtf8().toStdString(); } diff --git a/common/minizip/ioapi.c b/common/minizip/ioapi.c index 7f5c191b..3c5c1dbf 100644 --- a/common/minizip/ioapi.c +++ b/common/minizip/ioapi.c @@ -28,6 +28,10 @@ #include "ioapi.h" +#ifdef _WIN32 +#include +#endif + voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode) { if (pfilefunc->zfile_func64.zopen64_file != NULL) @@ -112,6 +116,34 @@ static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, in static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, int mode) { +#ifdef _WIN32 + FILE* file = NULL; + const wchar_t* mode_fopen = NULL; + if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) + mode_fopen = L"rb"; + else + if (mode & ZLIB_FILEFUNC_MODE_EXISTING) + mode_fopen = L"r+b"; + else + if (mode & ZLIB_FILEFUNC_MODE_CREATE) + mode_fopen = L"wb"; + + int wcSize = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, filename, -1, NULL, 0); + if (wcSize == 0) { + return NULL; + } + wchar_t *wcName = (wchar_t *)malloc(sizeof(wchar_t) * wcSize + 8); + if (wcName == NULL) { + return NULL; + } + MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, filename, -1, wcName, wcSize); + + if ((filename!=NULL) && (mode_fopen != NULL)) + file = _wfopen((const wchar_t*)wcName, mode_fopen); + free(wcName); + + return file; +#else FILE* file = NULL; const char* mode_fopen = NULL; if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) @@ -126,6 +158,7 @@ static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, if ((filename!=NULL) && (mode_fopen != NULL)) file = FOPEN_FUNC((const char*)filename, mode_fopen); return file; +#endif }