From 33a35f20381021414d1ee295b5cabeddd6c7a91c Mon Sep 17 00:00:00 2001 From: taynpg Date: Tue, 18 Feb 2025 10:38:38 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9A=E4=BF=AE=E6=AD=A3match=5Ffiles?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E7=9A=84unicode=E7=89=88=E6=9C=AC=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=85=B3=E9=97=AD/source-charset:utf-8?= =?UTF-8?q?=E7=9A=84cmake=E5=AE=9A=E4=B9=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 3 ++- src/of_path.cpp | 27 +++++++++++++++++++++------ 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6d13544..5a4a604 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,15 +4,16 @@ project(ofen LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) +if(NOT DEFINED USE_UTF8_ALL) if (MSVC) add_compile_options(/source-charset:utf-8) endif() - if (CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND CMAKE_SYSTEM_NAME MATCHES "Windows") MESSAGE(STATUS "ofen Add MinGW Param.") add_compile_options(-finput-charset=utf-8) add_compile_options(-fexec-charset=gbk) endif() +endif() set(CMAKE_DEBUG_POSTFIX "d") message(STATUS "System: ${CMAKE_SYSTEM_NAME}") diff --git a/src/of_path.cpp b/src/of_path.cpp index 155bc2c..6a4c5b1 100644 --- a/src/of_path.cpp +++ b/src/of_path.cpp @@ -206,20 +206,35 @@ ofStrVec COfPath::match_files(const ofString& path) { ofStrVec ret; - fs::path in(path); - fs::path parent_path = in.parent_path(); - std::string filename_pattern = in.filename().string(); + // 使用宽字符版本的 fs::path + std::filesystem::path in(path); + std::filesystem::path parent_path = in.parent_path(); + ofString filename_pattern = in.filename().native(); // 使用 native() 获取正确的字符类型 if (parent_path.empty()) { - parent_path = fs::current_path(); + parent_path = std::filesystem::current_path(); } + // 根据 UNICODE_OFSTR 选择正确的正则表达式类型 +#ifdef UNICODE_OFSTR + std::wregex file_regex; + ofString regex_pattern = std::regex_replace(filename_pattern, std::wregex(ofT(R"(\*)")), ofT(".*")); + regex_pattern = std::regex_replace(regex_pattern, std::wregex(ofT(R"(\?)")), ofT(".")); +#else + std::regex file_regex; std::string regex_pattern = std::regex_replace(filename_pattern, std::regex(R"(\*)"), ".*"); regex_pattern = std::regex_replace(regex_pattern, std::regex(R"(\?)"), "."); +#endif try { - std::regex file_regex(regex_pattern); - for (const auto& entry : fs::directory_iterator(parent_path)) { +#ifdef UNICODE_OFSTR + file_regex = std::wregex(regex_pattern); +#else + file_regex = std::regex(regex_pattern); +#endif + + // 遍历目录 + for (const auto& entry : std::filesystem::directory_iterator(parent_path)) { #ifdef UNICODE_OFSTR if (std::regex_match(entry.path().filename().wstring(), file_regex)) { ret.push_back(entry.path().wstring());