codec:处理编码问题。
This commit is contained in:
@@ -1,6 +1,32 @@
|
||||
#include "xml_opr.h"
|
||||
#include <filesystem>
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user