From 5cd7a0bae083c1dcaf674772d8a71ff3b4c37102 Mon Sep 17 00:00:00 2001
From: chenluhua1980 <Chenluhua@qq.com>
Date: 星期三, 10 十二月 2025 10:55:39 +0800
Subject: [PATCH] loadReports,兼容各种文件编码

---
 SourceCode/Bond/Servo/HsmsPassive.cpp |  212 ++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 187 insertions(+), 25 deletions(-)

diff --git a/SourceCode/Bond/Servo/HsmsPassive.cpp b/SourceCode/Bond/Servo/HsmsPassive.cpp
index 3304fa9..5603aff 100644
--- a/SourceCode/Bond/Servo/HsmsPassive.cpp
+++ b/SourceCode/Bond/Servo/HsmsPassive.cpp
@@ -228,40 +228,127 @@
 
 int CHsmsPassive::loadVarialbles(const char* pszFilepath)
 {
-	CStdioFile file;
-	if (!file.Open(pszFilepath, CFile::modeRead)) {
+	// 鍏堣鍘熷瀛楄妭锛屽悗缁啀鎸� UTF-8/BOM 鎴栨湰鍦扮紪鐮佽浆鎹�
+	CFile file;
+	if (!file.Open(pszFilepath, CFile::modeRead | CFile::shareDenyNone)) {
 		return -1;
 	}
 
-	std::regex pattern("^\\d+,.*");  // 鍖归厤浠ユ暟瀛�+閫楀彿寮�澶寸殑瀛楃涓�
+	const ULONGLONG nLen = file.GetLength();
+	if (nLen == 0) {
+		return -1;
+	}
+
+	std::string buffer;
+	buffer.resize(static_cast<size_t>(nLen));
+	file.Read(buffer.data(), static_cast<UINT>(nLen));
+	file.Close();
+
+	const unsigned char* bytes = reinterpret_cast<const unsigned char*>(buffer.data());
+	size_t offset = 0;
+	CStringW content;
+
+	// UTF-8 BOM
+	if (nLen >= 3 && bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) {
+		offset = 3;
+	}
+
+	// UTF-16 LE BOM
+	if (nLen >= 2 && bytes[0] == 0xFF && bytes[1] == 0xFE) {
+		const wchar_t* wdata = reinterpret_cast<const wchar_t*>(buffer.data() + 2);
+		const size_t wlen = (nLen - 2) / sizeof(wchar_t);
+		content.SetString(wdata, static_cast<int>(wlen));
+	}
+	// UTF-16 BE BOM
+	else if (nLen >= 2 && bytes[0] == 0xFE && bytes[1] == 0xFF) {
+		const size_t wlen = (nLen - 2) / sizeof(wchar_t);
+		std::wstring temp;
+		temp.reserve(wlen);
+		for (size_t i = 0; i < wlen; ++i) {
+			wchar_t ch = static_cast<wchar_t>(bytes[2 + i * 2] << 8 | bytes[2 + i * 2 + 1]);
+			temp.push_back(ch);
+		}
+		content = temp.c_str();
+	}
+	// 灏濊瘯 UTF-8锛堝惈鏃� BOM锛�
+	else {
+		auto tryUtf8 = [&](size_t off) -> bool {
+			int need = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, buffer.data() + off,
+				static_cast<int>(buffer.size() - off), nullptr, 0);
+			if (need <= 0) return false;
+			std::wstring temp;
+			temp.resize(need);
+			MultiByteToWideChar(CP_UTF8, 0, buffer.data() + off,
+				static_cast<int>(buffer.size() - off), temp.data(), need);
+			content = temp.c_str();
+			return true;
+		};
+
+		if (!tryUtf8(offset)) {
+			// 鍥為��鍒版湰鍦颁唬鐮侀〉
+			int need = MultiByteToWideChar(CP_ACP, 0, buffer.data(), static_cast<int>(buffer.size()), nullptr, 0);
+			if (need > 0) {
+				std::wstring temp;
+				temp.resize(need);
+				MultiByteToWideChar(CP_ACP, 0, buffer.data(), static_cast<int>(buffer.size()), temp.data(), need);
+				content = temp.c_str();
+			}
+		}
+	}
+
+	if (content.IsEmpty()) {
+		return -1;
+	}
+
+	std::wregex pattern(L"^\\d+,.+");  // 鍖归厤浠ユ暟瀛�+閫楀彿寮�澶寸殑瀛楃涓�
 	std::vector<SERVO::CVariable*> variables;
 	int index, last;
-	CString strLine;
-	CString strId, strName, strFormat, strRemark;
-	while (file.ReadString(strLine)) {
-		if (!std::regex_match((LPTSTR)(LPCTSTR)strLine, pattern)) {
+	CStringW strLine;
+	CStringW strId, strName, strFormat, strRemark;
+	std::wstringstream ss(content.GetString());
+	auto narrowFromW = [](const CStringW& s) -> std::string {
+		int need = WideCharToMultiByte(CP_ACP, 0, s, -1, nullptr, 0, nullptr, nullptr);
+		if (need <= 0) return {};
+		std::string out(static_cast<size_t>(need - 1), '\0');
+		WideCharToMultiByte(CP_ACP, 0, s, -1, out.data(), need, nullptr, nullptr);
+		return out;
+	};
+	std::wstring line;
+	while (std::getline(ss, line, L'\n')) {
+		strLine = line.c_str();
+		strLine.Trim();
+		if (strLine.IsEmpty()) continue;
+		if (!std::regex_match(static_cast<LPCWSTR>(strLine), pattern)) {
 			continue;
 		}
 
 		last = 0;
-		index = strLine.Find(",", last);
+		index = strLine.Find(L",", last);
 		if (index < 0) continue;
 		strId = strLine.Left(index);
 		last = index + 1;
 
-		index = strLine.Find(",", last);
+		index = strLine.Find(L",", last);
 		if (index < 0) continue;
 		strName = strLine.Mid(last, index - last);
 		last = index + 1;
 
-		index = strLine.Find(",", last);
+		index = strLine.Find(L",", last);
 		if (index < 0) continue;
 		strFormat = strLine.Mid(last, index - last);
 		strRemark = strLine.Right(strLine.GetLength() - index - 1);
-		strRemark.Replace(_T("\\r\\n"), _T("\r\n"));
+		strRemark.Replace(L"\\r\\n", L"\r\n");
+
+		std::string sId = narrowFromW(strId);
+		std::string sName = narrowFromW(strName);
+		std::string sFormat = narrowFromW(strFormat);
+		std::string sRemark = narrowFromW(strRemark);
 
 		SERVO::CVariable* pVarialble = new SERVO::CVariable(
-			(LPTSTR)(LPCTSTR)strId, (LPTSTR)(LPCTSTR)strName, (LPTSTR)(LPCTSTR)strFormat, (LPTSTR)(LPCTSTR)strRemark);
+			sId.c_str(),
+			sName.c_str(),
+			sFormat.c_str(),
+			sRemark.c_str());
 		variables.push_back(pVarialble);
 	}
 
@@ -272,8 +359,6 @@
 		}
 	}
 
-
-	file.Close();
 	return 0;
 }
 
@@ -338,30 +423,108 @@
 
 int CHsmsPassive::loadReports(const char* pszFilepath)
 {
-	CStdioFile file;
-	if (!file.Open(pszFilepath, CFile::modeRead)) {
+	// 鍏煎 UTF-8/BOM 涓庢湰鍦扮紪鐮佽鍙�
+	CFile file;
+	if (!file.Open(pszFilepath, CFile::modeRead | CFile::shareDenyNone)) {
 		return -1;
 	}
 
-	std::regex pattern("^\\d+,\\(\\d+(,\\d+)*\\).*");  // 鍖归厤浠ユ暟瀛�+閫楀彿寮�澶寸殑瀛楃涓�
+	const ULONGLONG nLen = file.GetLength();
+	if (nLen == 0) {
+		return -1;
+	}
+
+	std::string buffer;
+	buffer.resize(static_cast<size_t>(nLen));
+	file.Read(buffer.data(), static_cast<UINT>(nLen));
+	file.Close();
+
+	const unsigned char* bytes = reinterpret_cast<const unsigned char*>(buffer.data());
+	size_t offset = 0;
+	CStringW content;
+
+	// UTF-8 BOM
+	if (nLen >= 3 && bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) {
+		offset = 3;
+	}
+
+	// UTF-16 LE BOM
+	if (nLen >= 2 && bytes[0] == 0xFF && bytes[1] == 0xFE) {
+		const wchar_t* wdata = reinterpret_cast<const wchar_t*>(buffer.data() + 2);
+		const size_t wlen = (nLen - 2) / sizeof(wchar_t);
+		content.SetString(wdata, static_cast<int>(wlen));
+	}
+	// UTF-16 BE BOM
+	else if (nLen >= 2 && bytes[0] == 0xFE && bytes[1] == 0xFF) {
+		const size_t wlen = (nLen - 2) / sizeof(wchar_t);
+		std::wstring temp;
+		temp.reserve(wlen);
+		for (size_t i = 0; i < wlen; ++i) {
+			wchar_t ch = static_cast<wchar_t>(bytes[2 + i * 2] << 8 | bytes[2 + i * 2 + 1]);
+			temp.push_back(ch);
+		}
+		content = temp.c_str();
+	}
+	else {
+		auto tryUtf8 = [&](size_t off) -> bool {
+			int need = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, buffer.data() + off,
+				static_cast<int>(buffer.size() - off), nullptr, 0);
+			if (need <= 0) return false;
+			std::wstring temp;
+			temp.resize(need);
+			MultiByteToWideChar(CP_UTF8, 0, buffer.data() + off,
+				static_cast<int>(buffer.size() - off), temp.data(), need);
+			content = temp.c_str();
+			return true;
+		};
+
+		if (!tryUtf8(offset)) {
+			int need = MultiByteToWideChar(CP_ACP, 0, buffer.data(), static_cast<int>(buffer.size()), nullptr, 0);
+			if (need > 0) {
+				std::wstring temp;
+				temp.resize(need);
+				MultiByteToWideChar(CP_ACP, 0, buffer.data(), static_cast<int>(buffer.size()), temp.data(), need);
+				content = temp.c_str();
+			}
+		}
+	}
+
+	if (content.IsEmpty()) {
+		return -1;
+	}
+
+	std::wregex pattern(L"^\\d+,\\(\\d+(,\\d+)*\\).*");  // 鍖归厤浠ユ暟瀛�+閫楀彿寮�澶寸殑瀛楃涓�
 	std::vector<SERVO::CReport*> reports;
 	int index;
-	CString strLine, strVariable;
-	CString strId;
-	while (file.ReadString(strLine)) {
-		if (!std::regex_match((LPTSTR)(LPCTSTR)strLine, pattern)) {
+	CStringW strLine, strVariable;
+	CStringW strId;
+	std::wstringstream ss(content.GetString());
+	auto narrowFromW = [](const CStringW& s) -> std::string {
+		int need = WideCharToMultiByte(CP_ACP, 0, s, -1, nullptr, 0, nullptr, nullptr);
+		if (need <= 0) return {};
+		std::string out(static_cast<size_t>(need - 1), '\0');
+		WideCharToMultiByte(CP_ACP, 0, s, -1, out.data(), need, nullptr, nullptr);
+		return out;
+	};
+	std::wstring line;
+	while (std::getline(ss, line, L'\n')) {
+		strLine = line.c_str();
+		strLine.Trim();
+		if (strLine.IsEmpty()) continue;
+		if (!std::regex_match(static_cast<LPCWSTR>(strLine), pattern)) {
 			continue;
 		}
 
-		index = strLine.Find(",", 0);
+		index = strLine.Find(L",", 0);
 		if (index < 0) continue;
 		strId = strLine.Left(index);
 		strVariable = strLine.Right(strLine.GetLength() - index - 1);
 		strVariable.Delete(0);
 		strVariable.Delete(strVariable.GetLength() - 1);
-		auto vids = parseVidList(strVariable);
+		CString strVariableA(narrowFromW(strVariable).c_str());
+		auto vids = parseVidList(strVariableA);
 
-		SERVO::CReport* pReport = new SERVO::CReport(atoi((LPTSTR)(LPCTSTR)strId), vids);
+		SERVO::CReport* pReport = new SERVO::CReport(_wtoi(strId), vids);
 		for (auto vid : vids) {
 			SERVO::CVariable* pVariable = getVariable(vid);
 			if (pVariable != nullptr) {
@@ -380,7 +543,6 @@
 	}
 	
 
-	file.Close();
 	return 0;
 }
 

--
Gitblit v1.9.3