chenluhua1980
2025-12-10 037036e48c4bba9e7f3ed25a51a194c71f0e27f9
loadCollectionEvents,文件编码兼容问题修复;
已修改1个文件
107 ■■■■ 文件已修改
SourceCode/Bond/Servo/HsmsPassive.cpp 107 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/HsmsPassive.cpp
@@ -585,42 +585,122 @@
int CHsmsPassive::loadCollectionEvents(const char* pszFilepath)
{
    CStdioFile file;
    if (!file.Open(pszFilepath, CFile::modeRead)) {
    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::CCollectionEvent*> events;
    int index, last;
    CString strLine, strRPTIDs;
    CString strId, strName, strDescription;
    while (file.ReadString(strLine)) {
        if (!std::regex_match((LPTSTR)(LPCTSTR)strLine, pattern)) {
    CStringW strLine, strRPTIDs;
    CStringW strId, strName, strDescription;
    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;
        strDescription = strLine.Mid(last, index - last);
        strRPTIDs = strLine.Right(strLine.GetLength() - index - 1);
        strRPTIDs.Delete(0);
        strRPTIDs.Delete(strRPTIDs.GetLength() - 1);
        auto prtids = parseVidList(strRPTIDs);
        CString strRPTIDsA(narrowFromW(strRPTIDs).c_str());
        auto prtids = parseVidList(strRPTIDsA);
        std::string sName = narrowFromW(strName);
        std::string sDesc = narrowFromW(strDescription);
        SERVO::CCollectionEvent* pEvent = new SERVO::CCollectionEvent(
            atoi(strId), (LPTSTR)(LPCTSTR)strName, (LPTSTR)(LPCTSTR)strDescription, prtids);
            _wtoi(strId), sName.c_str(), sDesc.c_str(), prtids);
        for (auto rptid : prtids) {
            SERVO::CReport* pReport = getReport(rptid);
            if (pReport != nullptr) {
@@ -636,9 +716,6 @@
            m_collectionEvents.push_back(item);
        }
    }
    file.Close();
    return 0;
}