FIX: delete special symbol for filename

delete special symbol when plateName for filename

Change-Id: Ibb6b6603bc2ca040cb765dbedd013564ebcf3dff
(cherry picked from commit 840c085ae842e77b81de73def038fa9b417eac84)
This commit is contained in:
zhou.xu 2023-06-12 14:19:44 +08:00 committed by Lane.Wei
parent eca3d311d7
commit ca81c370fd
4 changed files with 21 additions and 5 deletions

View File

@ -1,6 +1,5 @@
#include <cstddef>
#include <algorithm>
#include <regex>
#include <numeric>
#include <vector>
#include <string>
@ -1610,7 +1609,7 @@ void PartPlate::set_plate_name(const std::string &name)
if (boost::equals(m_name, name)) return;
m_name = name;
std::regex reg("[\\\\/:*?\"<>|]");
std::regex reg("[\\\\/:*?\"<>|\\0]");
m_name= regex_replace(m_name, reg, "");
m_name_change = true;
if (m_plater) {

View File

@ -9474,7 +9474,7 @@ void Plater::export_gcode_3mf(bool export_all)
//BBS replace gcode extension to .gcode.3mf
default_output_file = default_output_file.replace_extension(".gcode.3mf");
default_output_file = fs::path(Slic3r::fold_utf8_to_ascii(default_output_file.string()));
default_output_file = fs::path(Slic3r::fold_utf8_to_ascii(default_output_file.string(),true));
//Get a last save path
start_dir = appconfig.get_last_output_dir(default_output_file.parent_path().string(), false);

View File

@ -4,6 +4,8 @@
#include <string.h>
#include <locale>
#include <boost/locale/encoding_utf.hpp>
#include <codecvt>
#include <regex>
namespace Slic3r {
@ -1942,7 +1944,7 @@ static void fold_to_ascii(wchar_t c, std::back_insert_iterator<std::wstring>& ou
*out = *it;
}
std::string fold_utf8_to_ascii(const std::string &src)
std::string fold_utf8_to_ascii(const std::string &src, bool is_convert_for_filename)
{
std::wstring wstr = boost::locale::conv::utf_to_utf<wchar_t>(src.c_str(), src.c_str() + src.size());
std::wstring dst;
@ -1950,6 +1952,21 @@ std::string fold_utf8_to_ascii(const std::string &src)
auto out = std::back_insert_iterator<std::wstring>(dst);
for (wchar_t c : wstr)
fold_to_ascii(c, out);
if (is_convert_for_filename) {
std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
auto dstStr = converter.to_bytes(dst);
std::size_t found = dstStr.find_last_of("/\\");
if (found != std::string::npos) {
std::string dir = dstStr.substr(0, found);
std::string filename = dstStr.substr(found + 1);
std::regex reg("[\\\\/:*?\"<>|\\0]");
std::string newFileName = regex_replace(filename, reg, "");
dstStr = dir + "\\" + newFileName;
}
dst = converter.from_bytes(dstStr);
}
return boost::locale::conv::utf_to_utf<char>(dst.c_str(), dst.c_str() + dst.size());
}

View File

@ -7,7 +7,7 @@ namespace Slic3r {
// If possible, remove accents from accented latin characters.
// This function is useful for generating file names to be processed by legacy firmwares.
extern std::string fold_utf8_to_ascii(const std::string &src);
extern std::string fold_utf8_to_ascii(const std::string &src,bool is_convert_for_filename=false);
// Convert the input UNICODE character to a string of maximum 4 output ASCII characters.
// Return the end of the string written to the output.