From df1dd36d3bc37d8ae5a22a25400674cd9f70c50c Mon Sep 17 00:00:00 2001 From: taynpg Date: Sun, 19 May 2024 23:33:06 +0800 Subject: [PATCH] =?UTF-8?q?codec=EF=BC=9A=E5=A4=84=E7=90=86=E7=BC=96?= =?UTF-8?q?=E7=A0=81=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainWidget.cpp | 2 +- MainWidget.h | 2 +- README.md | 6 +++++- config/readme.txt | 4 ++-- config/xmlopr-example.ini | 2 +- src/config.cpp | 3 ++- src/xml_opr.cpp | 32 ++++++++++++++++++++++++++++++++ 7 files changed, 44 insertions(+), 7 deletions(-) diff --git a/MainWidget.cpp b/MainWidget.cpp index 3605d2f..090b64a 100644 --- a/MainWidget.cpp +++ b/MainWidget.cpp @@ -105,7 +105,7 @@ MainWidget::MainWidget(QWidget* parent) : QWidget(parent), ui(new Ui::MainWidget ini_.set_work_exe(exe_path_); base_ = ini_.get_config(); - ui->edStatus->setText(QString::fromLocal8Bit(base_.xml_path.c_str())); + ui->edStatus->setText(QString::fromStdString(base_.xml_path)); } void MainWidget::copy_key() diff --git a/MainWidget.h b/MainWidget.h index 7a90531..154a30c 100644 --- a/MainWidget.h +++ b/MainWidget.h @@ -78,6 +78,6 @@ private: std::size_t cur_page_{1}; std::size_t all_page_{1}; CAttributeEdit* attri_edit_{}; - OprBase base_{}; + OprBase base_{}; }; #endif // MAINWIDGET_H diff --git a/README.md b/README.md index 15c4fbb..6d1b694 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ # 介绍 -仅一层级的xml编辑器。 \ No newline at end of file +仅一层级的xml编辑器。 + +# 编译环境 + +在 `msvc Qt5.14.2` 和 `vs2017` 环境下通过。 \ No newline at end of file diff --git a/config/readme.txt b/config/readme.txt index 81a3743..567a44c 100644 --- a/config/readme.txt +++ b/config/readme.txt @@ -1,6 +1,6 @@ 本工具目前仅实现最基础的功能,未做各种兼容性处理与判断,因此有一些默认的约定。 -(1)工具默认读取的配置名称为xmlopr.ini,位置在可执行文件同目录下。 -(2)在windows下,ini内容如果含中文,需要GBK或者ANSI编码。 +(1)工具默认读取的配置名称为xmlopr.ini,位置在可执行文件同目录下(必须要有)。 +(2)ini配置文件为UTF-8编码。 (3)ini配置中的purpose一栏,请把不会重复的字段放在首位,程序会把这个字段作为检索key来查找存储数据。 (4)程序仅在启动时加载ini配置,更改需要重新打开程序。 \ No newline at end of file diff --git a/config/xmlopr-example.ini b/config/xmlopr-example.ini index 6f6cf89..c05ead0 100644 --- a/config/xmlopr-example.ini +++ b/config/xmlopr-example.ini @@ -2,4 +2,4 @@ oper_node=IODEF/ITEMS/ the_node=ITEM purpose=name,cat,pr,pw -xml_path=D:\ļ \conf-io.xml \ No newline at end of file +xml_path=D:\conf-io.xml \ No newline at end of file diff --git a/src/config.cpp b/src/config.cpp index 5fa9c8e..563984a 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -22,7 +22,7 @@ bool ConfigIni::set_work_exe(const std::string& dir) void ConfigIni::set_xml_path(const std::string& path) { if (ini_.IsEmpty()) { - return ; + return; } ini_.SetValue("Basic", "xml_path", path.c_str()); ini_.SaveFile(ini_path_.c_str()); @@ -38,6 +38,7 @@ bool ConfigIni::parse_ini() if (ini_.LoadFile(ini_path_.c_str()) != SI_OK) { return false; } + ini_.SetUnicode(); opr_base_.node_path = ini_.GetValue("Basic", "oper_node"); opr_base_.purpose = ini_.GetValue("Basic", "purpose"); opr_base_.the_node = ini_.GetValue("Basic", "the_node"); diff --git a/src/xml_opr.cpp b/src/xml_opr.cpp index 82194ec..13c2220 100644 --- a/src/xml_opr.cpp +++ b/src/xml_opr.cpp @@ -1,6 +1,32 @@ #include "xml_opr.h" #include +#ifdef _WIN32 +#include +std::string utf8_to_gbk(const std::string& utf8_str) +{ + // UTF-8 to Wide Char (UTF-16) + int wide_char_len = MultiByteToWideChar(CP_UTF8, 0, utf8_str.c_str(), -1, nullptr, 0); + if (wide_char_len == 0) { + throw std::runtime_error("Failed to convert UTF-8 to wide char"); + } + + std::wstring wide_str(wide_char_len, 0); + MultiByteToWideChar(CP_UTF8, 0, utf8_str.c_str(), -1, &wide_str[0], wide_char_len); + + // Wide Char (UTF-16) to GBK + int gbk_len = WideCharToMultiByte(CP_ACP, 0, wide_str.c_str(), -1, nullptr, 0, nullptr, nullptr); + if (gbk_len == 0) { + throw std::runtime_error("Failed to convert wide char to GBK"); + } + + std::string gbk_str(gbk_len, 0); + WideCharToMultiByte(CP_ACP, 0, wide_str.c_str(), -1, &gbk_str[0], gbk_len, nullptr, nullptr); + + return gbk_str; +} +#endif + namespace fs = std::filesystem; CXmlOpr::CXmlOpr() = default; @@ -8,9 +34,15 @@ CXmlOpr::~CXmlOpr() = default; bool CXmlOpr::open(const std::string& xml_path) { +#ifdef _WIN32 + if (doc_.LoadFile(utf8_to_gbk(xml_path).c_str()) != tinyxml2::XML_SUCCESS) { + return false; + } +#else if (doc_.LoadFile(xml_path.c_str()) != tinyxml2::XML_SUCCESS) { return false; } +#endif xml_path_ = xml_path; return true; }