欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

VC6.0下jsoncpp配置與中文亂碼處理:編譯選項(xiàng)與編碼轉(zhuǎn)換實(shí)踐

VC6.0下jsoncpp配置與中文亂碼處理:編譯選項(xiàng)與編碼轉(zhuǎn)換實(shí)踐 簡(jiǎn)介面向 VC6.0 開(kāi)發(fā)者的 JSONCPP 集成資源針對(duì)在 Visual C 6.0 環(huán)境下解析、生成 JSON 時(shí)常見(jiàn)的中文亂碼問(wèn)題提供了完整的案例工程與可直接運(yùn)行的程序。壓縮包共 72 個(gè)文件整體 3.77MB以頭文件h、源碼cpp、內(nèi)聯(lián)模板inl為核心附帶工程文件dsp/dsw、界面資源rc/ico以及編譯輔助文件obj/sbr并包含一份【重要】使用說(shuō)明文檔和必讀文本。已有 590 人學(xué)習(xí)下載資源內(nèi)置 jsoncpp-src-0.5.0 源碼無(wú)需另行編譯庫(kù)文件加入工程即可使用。具體內(nèi)容包括完整的 VC6.0 對(duì)話框/控制臺(tái)測(cè)試案例、中文 UTF-8 編碼處理配置、JSON 解析與序列化的可運(yùn)行演示以及排錯(cuò)思路。通過(guò)使用說(shuō)明文檔可快速掌握在 VC6.0 中規(guī)避中文亂碼、穩(wěn)定處理 JSON 數(shù)據(jù)的方法對(duì)維護(hù)舊系統(tǒng)或?qū)W習(xí)早期 C 項(xiàng)目集成的開(kāi)發(fā)者尤為實(shí)用。1. 給 VC6.0 補(bǔ)上 JSON 解析能力為什么首選 jsoncpp早該被淘汰的 VC6.0 依然在工控、教學(xué)和存量維護(hù)項(xiàng)目里大量存在而 JSON 已經(jīng)成為設(shè)備接口和配置文件的默認(rèn)交換格式。在 VC6.0 上解析 JSON 有個(gè)天然痛點(diǎn)這個(gè)古董編譯器只支持 C98 的早期子集很多現(xiàn)代 C 庫(kù)根本編不過(guò)更不用說(shuō) STL 的 wchar_t 支持和編碼處理在 VC6 上表現(xiàn)得極其別扭。jsoncpp 是少有的、能在這個(gè)環(huán)境下穩(wěn)定編譯的 C JSON 庫(kù)而且它開(kāi)源、單包可移植、API 足夠直觀適合嵌入式設(shè)備調(diào)試工具和 Windows 老項(xiàng)目里做配置讀寫(xiě)。這份資源的價(jià)值在于把 jsoncpp 的源碼包、工程配置、各種解析和生成案例全部打包好并且專門對(duì)中文亂碼做了預(yù)處理拿到手不用再去網(wǎng)上東拼西湊找兼容補(bǔ)丁適合做設(shè)備聯(lián)調(diào)、寫(xiě)上位機(jī)工具、維護(hù)老系統(tǒng)的從業(yè)者。2. 搭建 VC6.0 的 jsoncpp 環(huán)境頭文件、靜態(tài)庫(kù)與工程選項(xiàng)2.1 編譯前的準(zhǔn)備源碼里挑對(duì)文件別一股腦全編進(jìn)工程jsoncpp 的源碼從 GitHub 上下下來(lái)是一整個(gè)倉(cāng)庫(kù)但 VC6.0 的工程不需要那么多文件。我一般只挑src/lib_json目錄下的json_reader.cpp、json_writer.cpp、json_value.cpp三個(gè)實(shí)現(xiàn)文件以及include目錄下的json/頭文件目錄。其他如json_tool.h、json_batchallocator.h是這三個(gè)文件內(nèi)部依賴的輔助頭不需要額外加入工程編譯時(shí)自動(dòng)帶上。很多人在這一步翻車的原因是直接把整個(gè)src目錄拉進(jìn)工程結(jié)果json_reader.cpp里引用了json_batchallocator.h而 VC6 的預(yù)處理器對(duì)當(dāng)前文件所在目錄的搜索順序和現(xiàn)代 IDE 不一樣經(jīng)常報(bào)“無(wú)法打開(kāi)包含文件”的錯(cuò)誤。解決辦法是把include目錄在“工具 - 選項(xiàng) - 目錄 - Include files”里加到最前面同時(shí)把src/lib_json目錄也加進(jìn)包含路徑這樣三個(gè) cpp 文件無(wú)論放在工程的哪個(gè)子目錄都能正確找到頭文件。// 在工程設(shè)置里添加包含路徑后頭文件這樣引用即可 #include json/json.h #include iostream #include fstream這段代碼的頭文件引用方式?jīng)Q定了你的工程目錄結(jié)構(gòu)json/json.h意味著你的包含路徑必須指向include目錄這樣編譯器會(huì)去include/json/下找json.h。我見(jiàn)過(guò)有人把json.h直接拷到工程根目錄再改成#include json.h也能編過(guò)但后續(xù)升級(jí)源碼包時(shí)容易漏掉其他頭文件不建議這么干。如果用的是源碼包里的json/json.h那json/value.h、json/reader.h、json/writer.h、json/features.h這些也會(huì)被自動(dòng)遞歸包含不需要手動(dòng)逐個(gè)添加。2.2 編譯選項(xiàng)的四個(gè)關(guān)鍵點(diǎn)C 語(yǔ)言標(biāo)準(zhǔn)、warning 級(jí)別和預(yù)處理指令VC6.0 對(duì) C 標(biāo)準(zhǔn)的支持停留在 1998 年之前的水準(zhǔn)比 C98 還要老。jsoncpp 官方源碼為了兼容舊編譯器在json/config.h里做了一些預(yù)處理判斷但 VC6 的_MSC_VER值對(duì)應(yīng)的是 1200新版 jsoncpp 的某些分支沒(méi)有覆蓋到這個(gè)老版本所以需要在工程里強(qiáng)制定義兩個(gè)宏來(lái)解決。// 在工程設(shè)置 - C/C - Preprocessor definitions 里添加 // _WIN32 // _MSC_VER1200 // JSON_NO_INT64 (如果不需要 64 位整數(shù)解析)第一個(gè)宏_WIN32是確認(rèn) Windows 平臺(tái)jsoncpp 內(nèi)部有一些平臺(tái)相關(guān)的分支沒(méi)有這個(gè)宏會(huì)走 Linux 分支導(dǎo)致std::string的迭代器類型不匹配。_MSC_VER1200是讓編譯器報(bào)告自己的版本號(hào)jsoncpp 的config.h里有針對(duì)_MSC_VER的#if _MSC_VER 1400之類的判斷會(huì)啟用一些舊代碼路徑比如禁用long long的格式化輸出。JSON_NO_INT64是可選宏老工程不需要解析超過(guò) 32 位整數(shù)的 JSON 時(shí)建議加上防止Json::Value內(nèi)部使用json_int_t類型在 VC6 下出現(xiàn)__int64與long long混用問(wèn)題。Warning 級(jí)別我建議設(shè)置在Level 1也就是只顯示嚴(yán)重警告。jsoncpp 的源碼本身能通過(guò) Level 1 編譯但如果有第三方庫(kù)一起編譯Level 4 的警告可能刷屏。最煩人的是 VC6 對(duì)某些for循環(huán)作用域的處理和標(biāo)準(zhǔn)不一致jsoncpp 源碼里已經(jīng)盡量避免但你真的遇到for loop initial declaration used outside C99 mode之類的提示需要在編譯選項(xiàng)里把Disable Language Extensions關(guān)掉也就是不要勾選“禁用語(yǔ)言擴(kuò)展”。2.3 編譯成靜態(tài)庫(kù)還是直接用源碼兩種方式的效率對(duì)比在 VC6.0 里使用 jsoncpp 有兩種姿勢(shì)把三個(gè) cpp 文件直接加進(jìn)自己的工程一起編譯或者先編譯一個(gè)json_lib.lib靜態(tài)庫(kù)再用。直接加源碼的方式最簡(jiǎn)單但每次編譯整個(gè)工程都要重新編譯 jsoncpp 的三個(gè)文件工程稍微大一點(diǎn)就浪費(fèi)時(shí)間。編?kù)o態(tài)庫(kù)的方式一勞永逸但初次配置稍微繁瑣。靜態(tài)庫(kù)工程的配置要點(diǎn)新建一個(gè) Win32 Static Library 工程把三個(gè) cpp 文件加進(jìn)去編譯選項(xiàng)和 2.2 節(jié)完全一致然后編譯生成.lib文件。在使用端工程的“鏈接器 - 輸入 - 附加依賴項(xiàng)”里填入這個(gè) lib 的名字和路徑。需要注意VC6 的靜態(tài)庫(kù)有單線程版和多線程版之分如果你的使用端工程用的是 Debug Multithreaded那靜態(tài)庫(kù)也必須用相同的運(yùn)行時(shí)庫(kù)選項(xiàng)編譯否則鏈接時(shí)會(huì)報(bào)LNK2005或LNK4098這種符號(hào)沖突錯(cuò)誤。# 鏈接器報(bào)錯(cuò)示例LNK2005 _malloc already defined in LIBCMT.lib # 原因靜態(tài)庫(kù)用單線程 CRT(/ML) 編譯而使用端用多線程 CRT(/MT) # 解決在靜態(tài)庫(kù)工程設(shè)置里把 Runtime library 改成和使用端一致的選項(xiàng)我一般習(xí)慣直接編?kù)o態(tài)庫(kù)特別是在維護(hù)多個(gè)老項(xiàng)目的時(shí)候一份編譯好的 lib 可以給三四個(gè)工程共用。但如果你是第一次調(diào)通 jsoncpp我建議先用直接加源碼的方式跑通代碼邏輯等確認(rèn)沒(méi)問(wèn)題再抽成靜態(tài)庫(kù)否則一次出現(xiàn)環(huán)境問(wèn)題和代碼問(wèn)題疊加在一起排錯(cuò)會(huì)非常痛苦。3. 基礎(chǔ)解析案例從單層對(duì)象到嵌套數(shù)組的實(shí)際用法3.1 讀一個(gè)簡(jiǎn)單 JSON 對(duì)象parse 的三種方式與返回值處理jsoncpp 的Reader類提供三種 parse 重載形式接收 C 字符串、接收std::string、接收std::istream。在 VC6.0 里std::istream重載形式用得最多因?yàn)樵O(shè)備接口經(jīng)常把 JSON 數(shù)據(jù)放在文件流或串口數(shù)據(jù)流里。無(wú)論哪種重載第一個(gè)參數(shù)是 JSON 數(shù)據(jù)源第二個(gè)參數(shù)是接收結(jié)果的Json::Value引用返回bool表示解析是否成功。#include json/json.h #include iostream #include fstream bool parseJsonFile(const char* filePath, Json::Value root) { std::ifstream fin(filePath); if (!fin.is_open()) { std::cerr Cannot open file: filePath std::endl; return false; } Json::Reader reader; bool success reader.parse(fin, root, false); if (!success) { // 用 collectErrors 拿到具體錯(cuò)誤信息 std::string errMsg reader.getFormatedErrorMessages(); std::cerr Parse error: errMsg std::endl; } fin.close(); return success; }這段代碼演示了標(biāo)準(zhǔn)的三步流程打開(kāi)文件流、調(diào)用 parse、失敗時(shí)取錯(cuò)誤信息。第三個(gè)參數(shù)false表示不收集所有錯(cuò)誤信息只保留第一條錯(cuò)誤這樣出錯(cuò)時(shí)能快速定位。getFormatedErrorMessages()在解析失敗時(shí)返回包含行列號(hào)的錯(cuò)誤描述這個(gè)信息在調(diào)試設(shè)備返回的半截 JSON 數(shù)據(jù)時(shí)特別實(shí)用能直接告訴你 JSON 在哪一行哪個(gè)位置斷了。有一個(gè)容易被忽略的點(diǎn)parse 成功后Json::Value對(duì)象里的數(shù)據(jù)如果不及時(shí)提取會(huì)隨root的生命周期失效。所以解析函數(shù)盡量不要把Json::Value以值方式返回而是用引用參數(shù)傳入或者用智能指針管理。VC6 沒(méi)有std::shared_ptr一般用auto_ptr或者直接傳引用的方式我習(xí)慣傳引用代碼更直白也不會(huì)在對(duì)象拷貝時(shí)觸發(fā) jsoncpp 內(nèi)部引用計(jì)數(shù)的隱患。3.2 取字段值的類型判斷isValidMember 與 type 檢查配合設(shè)備返回的 JSON 字段經(jīng)常缺失或者類型不對(duì)有些人直接root[temperature].asDouble()取完之后才發(fā)現(xiàn)數(shù)據(jù)是字符串類型的23.5asDouble 返回 0排查半天。jsoncpp 的Value::isMember()方法只判斷字段是否存在不判斷類型對(duì)不對(duì)。更穩(wěn)妥的寫(xiě)法是先判斷類型再?zèng)Q定怎么取值。bool readTemperature(const Json::Value root, double temp) { const char* fieldName temperature; if (!root.isMember(fieldName)) { std::cerr Field missing: fieldName std::endl; return false; } const Json::Value field root[fieldName]; if (field.isDouble() || field.isInt()) { temp field.asDouble(); return true; } else if (field.isString()) { temp atof(field.asCString()); return true; } std::cerr Field type mismatch: fieldName type field.type() std::endl; return false; }這段代碼體現(xiàn)的是防御式解析思路先檢查字段存在性再檢查類型字符串?dāng)?shù)字也用atof兜底轉(zhuǎn)換。field.type()返回一個(gè)枚舉值Json::intValue為 0、uintValue為 1、realValue為 2、stringValue為 3 等等把這些值打印出來(lái)排查非常直觀。另外注意field.isInt()在 VC6 下對(duì) 32 位整數(shù)有效如果你開(kāi)啟了JSON_NO_INT64宏那isInt64()方法根本不存在不要去調(diào)用否則編譯直接報(bào)錯(cuò)。3.3 解析嵌套數(shù)組數(shù)組遍歷與對(duì)象數(shù)組的混合使用解析數(shù)組的核心是size()方法和operator[]的整數(shù)重載。jsoncpp 的數(shù)組可以用for (Json::Value::const_iterator it arr.begin(); it ! arr.end(); it)這種迭代器方式遍歷但在 VC6.0 下迭代器的operator*返回Value的引用類型類型推斷不如現(xiàn)代 C 靈活容易在賦值時(shí)多一次拷貝所以直接用索引遍歷更省心。struct SensorPoint { int id; double value; char name[32]; }; bool parseSensorArray(const Json::Value root, SensorPoint* points, int maxCount, int outCount) { if (!root.isMember(sensors) || !root[sensors].isArray()) { std::cerr sensors is not array std::endl; return false; } const Json::Value sensors root[sensors]; outCount 0; int n sensors.size(); if (n maxCount) { std::cerr Array too large: n maxCount std::endl; return false; } for (int i 0; i n; i) { const Json::Value item sensors[i]; if (!item.isObject()) continue; points[i].id item.get(id, -1).asInt(); points[i].value item.get(value, 0.0).asDouble(); strncpy(points[i].name, item.get(name, ).asCString(), 31); points[i].name[31] \0; outCount; } return true; }這里的item.get(id, -1)是 jsoncpp 提供的一個(gè)很有價(jià)值的方法第二個(gè)參數(shù)是默認(rèn)值字段不存在時(shí)直接返回默認(rèn)值不需要像 3.2 節(jié)那樣先isMember再取。但默認(rèn)值只保證字段缺失時(shí)不崩字段存在但類型不對(duì)時(shí)get返回的Value還是錯(cuò)的值所以對(duì)可靠性要求高的字段建議先用isMember檢查。數(shù)組遍歷的邊界條件值得注意sensors.size()返回Json::ArrayIndex類型在 VC6 下是unsigned int和int比較時(shí)注意符號(hào)問(wèn)題我寫(xiě)int n sensors.size()時(shí)編譯器會(huì)提示符號(hào)轉(zhuǎn)換警告直接強(qiáng)轉(zhuǎn)即可。4. 生成 JSON 數(shù)據(jù)對(duì)象構(gòu)造、寫(xiě)入文件與格式化控制4.1 用 Value 對(duì)象構(gòu)造嵌套結(jié)構(gòu)Value 的鏈?zhǔn)劫x值原理構(gòu)造 JSON 輸出比解析要友善得多。jsoncpp 的Json::Value重載了operator[]對(duì)不存在的字段名會(huì)自動(dòng)創(chuàng)建對(duì)應(yīng)類型的 Value 對(duì)象所以可以一層一層地往里塞數(shù)據(jù)。核心邏輯是先創(chuàng)建Value對(duì)象然后用[key]的方式賦值數(shù)組用append方法添加元素。Json::Value buildStatusReport() { Json::Value root; root[device_id] DEV-2024-001; root[status] online; root[uptime] 3600; // 嵌套對(duì)象直接鏈?zhǔn)皆L問(wèn)子節(jié)點(diǎn) root[network][ip] 192.168.1.100; root[network][mac] AA:BB:CC:DD:EE:FF; // 數(shù)組先創(chuàng)建空數(shù)組再 append Json::Value sensorList; for (int i 0; i 3; i) { Json::Value item; item[index] i; item[value] i * 1.5; sensorList.append(item); } root[sensors] sensorList; return root; }這里的鏈?zhǔn)劫x值root[network][ip] 192.168.1.100看起來(lái)像簡(jiǎn)單嵌套實(shí)際上內(nèi)部執(zhí)行了兩個(gè)步驟第一步root[network]創(chuàng)建一個(gè)空的 Value 對(duì)象并返回引用第二步在這個(gè)引用上再取[ip]并賦值。這種寫(xiě)法的潛在風(fēng)險(xiǎn)是如果你拼錯(cuò)了中間層鍵名不會(huì)報(bào)錯(cuò)而是自動(dòng)創(chuàng)建一個(gè)新的空對(duì)象最終生成的 JSON 里會(huì)出現(xiàn)多余的層級(jí)。所以寫(xiě)完構(gòu)造代碼后最好跑一遍流程把生成的 JSON 打印出來(lái)人工確認(rèn)結(jié)構(gòu)。4.2 縮進(jìn)與換行設(shè)置StyledWriter 還是 FastWriterjsoncpp 提供兩個(gè) Writer 類FastWriter輸出緊湊格式不帶多余空格和換行StyledWriter輸出帶縮進(jìn)的格式化文本便于人讀。設(shè)備對(duì)接時(shí)我一般用FastWriter因?yàn)槭×髁慷液芏嗲度胧皆O(shè)備解析器對(duì)空白字符處理比較弱。寫(xiě)配置文件時(shí)用StyledWriter方便人工修改。std::string valueToStyledString(const Json::Value value) { Json::StyledWriter writer; return writer.write(value); } std::string valueToFastString(const Json::Value value) { Json::FastWriter writer; return writer.write(value); }兩個(gè) Writer 的write方法都返回std::string而且是拷貝返回不是引用所以函數(shù)返回值直接賦給外部字符串沒(méi)問(wèn)題。有一個(gè)隱蔽坑FastWriter默認(rèn)會(huì)在輸出末尾加一個(gè)換行符\n這是為了讓輸出適合寫(xiě)入文件。如果你要把 JSON 拼進(jìn)網(wǎng)絡(luò)協(xié)議幀里需要手動(dòng)pop_back()或者用字符串裁剪去掉末尾換行。同理StyledWriter輸出末尾也有換行但它的末尾換行是縮進(jìn)格式的一部分保留比較合理。4.3 中文內(nèi)容的輸出編碼統(tǒng)一std::string 與 UTF-8 的約定這是 jsoncpp 在 VC6.0 場(chǎng)景下最容易出問(wèn)題的章節(jié)。jsoncpp 內(nèi)部的所有字符串處理都按 UTF-8 字節(jié)流理解它不會(huì)做編碼轉(zhuǎn)換。你的程序里如果直接寫(xiě)中文字符串字面量比如value[name] 溫度傳感器那這個(gè)字符串在 VC6 的源碼里是按本地代碼頁(yè)中文系統(tǒng)下是 GBK存儲(chǔ)的字節(jié)序列jsoncpp 會(huì)把它原樣寫(xiě)入 JSON 字符串值里不做任何轉(zhuǎn)譯。把這個(gè) JSON 輸出到任何一個(gè)按 UTF-8 解析的設(shè)備或網(wǎng)頁(yè)時(shí)中文就亂碼了。// 錯(cuò)誤示范直接賦值中文字面量 value[name] 溫度傳感器; // 字符串內(nèi)是 GBK 字節(jié) // 正確示范先轉(zhuǎn)成 UTF-8 字節(jié)序列再賦值 value[name] gbkToUtf8(溫度傳感器);這段代碼的gbkToUtf8函數(shù)在資源包里有獨(dú)立的實(shí)現(xiàn)核心原理是先用MultiByteToWideChar把 GBK 字節(jié)轉(zhuǎn)成 UTF-16 的寬字符再用WideCharToMultiByte把寬字符轉(zhuǎn)成 UTF-8 字節(jié)。VC6 的源碼文件默認(rèn)是 GBK 編碼所以字符串字面量天然是 GBK 字節(jié)流。資源里給的做法是所有中文輸入統(tǒng)一經(jīng)過(guò)這個(gè)轉(zhuǎn)換函數(shù)所有從 JSON 里讀出來(lái)的中文字符串如果要顯示到 Windows 窗口也要反向轉(zhuǎn)成 GBK。5. 解析中文內(nèi)容實(shí)例GBK 與 UTF-8 的字節(jié)層面換算5.1 中文亂碼的根本原因源碼編碼、執(zhí)行編碼與 JSON 編碼的三方不一致解決中文亂碼的關(guān)鍵不在于 jsoncpp而在于把三個(gè)環(huán)節(jié)的編碼理順。第一個(gè)環(huán)節(jié)是 VC6 源碼文件里的字符串字面量編碼中文 Windows 系統(tǒng)上默認(rèn)是 GBK第二個(gè)環(huán)節(jié)是程序運(yùn)行時(shí)字符串在內(nèi)存里的編碼字面量是什么字節(jié)存進(jìn)去就是什么字節(jié)第三個(gè)環(huán)節(jié)是 jsoncpp 解析和生成的 JSON 數(shù)據(jù)要求是 UTF-8。這三個(gè)環(huán)節(jié)只要有兩個(gè)不一致就會(huì)出現(xiàn)亂碼。我遇到過(guò)的典型場(chǎng)景是設(shè)備端上報(bào)的 JSON 數(shù)據(jù)是 UTF-8 編碼的設(shè)備名稱:溫度計(jì)解析到Value對(duì)象里是正常的 UTF-8 字節(jié)然后用 StyledWriter 打印到屏幕上調(diào)試控制臺(tái)按 GBK 顯示亂碼。這不是 jsoncpp 的問(wèn)題是調(diào)試輸出環(huán)節(jié)的編碼沒(méi)轉(zhuǎn)換。反過(guò)來(lái)程序里硬編碼的中文寫(xiě)入 JSON 再發(fā)給設(shè)備設(shè)備按 UTF-8 解碼同樣亂碼。所以整個(gè)數(shù)據(jù)處理鏈路里任何涉及外部接口的字符串都必須明確標(biāo)注是 UTF-8 還是 GBK。5.2 源頭修復(fù)用 UTF-8 編碼保存源文件直接從編譯期統(tǒng)一一個(gè)能根治部分問(wèn)題的土辦法在 VC6 里把包含中文字面量的源文件保存成 UTF-8 with BOM 編碼。VC6 的編譯器對(duì) UTF-8 with BOM 的源代碼文件會(huì)把字符串字面量按 UTF-8 字節(jié)存入目標(biāo)文件也就是說(shuō)運(yùn)行時(shí)內(nèi)存里的字節(jié)已經(jīng)和 JSON 要求的 UTF-8 一致了。這樣代碼里直接寫(xiě)value[name] 溫度傳感器也不會(huì)亂碼。但這個(gè)做法有三個(gè)副作用需要注意。第一VC6 的編輯器對(duì) UTF-8 with BOM 的支持不完整打開(kāi)文件時(shí)可能亂碼顯示但不影響編譯結(jié)果。第二如果代碼里同時(shí)有 GBK 編碼的源文件和 UTF-8 編碼的源文件字符串拼接時(shí)會(huì)出現(xiàn)半個(gè)中文的奇怪字節(jié)排查很困難。第三資源包里自帶的示例代碼有些是 GBK 編碼保存的你如果混用需要在工程設(shè)置里區(qū)分不能一刀切。// 用 UTF-8 with BOM 保存源文件后字面量本身已是 UTF-8 // 可以直接賦值不需要運(yùn)行時(shí)轉(zhuǎn)換 value[device_name] 溫度傳感器; // 但控制臺(tái)輸出仍需轉(zhuǎn)換UTF-8 - GBK std::string name value[device_name].asString(); std::string displayName utf8ToGbk(name.c_str()); printf(%s\n, displayName.c_str());注意這段代碼里的utf8ToGbk是資源包提供的反向轉(zhuǎn)換函數(shù)和 4.3 節(jié)的gbkToUtf8正好是互逆操作。采用 UTF-8 源文件方案時(shí)控制臺(tái)輸出前需要做utf8ToGbk轉(zhuǎn)換否則調(diào)試窗口還是亂碼。這個(gè)方案的好處是省掉了寫(xiě)入 JSON 前的轉(zhuǎn)換步驟缺點(diǎn)是所有的調(diào)試輸出都要帶轉(zhuǎn)換沒(méi)有哪種方案是絕對(duì)省事的關(guān)鍵是統(tǒng)一。5.3 運(yùn)行時(shí)動(dòng)態(tài)轉(zhuǎn)換的完整案例解析設(shè)備上報(bào)的 UTF-8 中文 JSON大多數(shù)智能設(shè)備的 JSON 都是 UTF-8 編碼所以解析端需要把 UTF-8 轉(zhuǎn)成 GBK 才能正常顯示或?qū)懭氡镜財(cái)?shù)據(jù)庫(kù)。下面這個(gè)函數(shù)讀取設(shè)備返回的文件解析后把中文內(nèi)容轉(zhuǎn)成 GBK 再打印完整的處理鏈路如下。std::wstring utf8ToUnicode(const char* utf8Str) { int len MultiByteToWideChar(CP_UTF8, 0, utf8Str, -1, NULL, 0); wchar_t* buffer new wchar_t[len]; MultiByteToWideChar(CP_UTF8, 0, utf8Str, -1, buffer, len); std::wstring result(buffer); delete[] buffer; return result; } std::string unicodeToGbk(const wchar_t* wideStr) { int len WideCharToMultiByte(CP_ACP, 0, wideStr, -1, NULL, 0, NULL, NULL); char* buffer new char[len]; WideCharToMultiByte(CP_ACP, 0, wideStr, -1, buffer, len, NULL, NULL); std::string result(buffer); delete[] buffer; return result; } std::string utf8ToGbk(const char* utf8Str) { std::wstring unicodeStr utf8ToUnicode(utf8Str); return unicodeToGbk(unicodeStr.c_str()); }這三個(gè)函數(shù)形成了完整的轉(zhuǎn)換鏈路UTF-8 字節(jié)先轉(zhuǎn)成 UTF-16 寬字符再由寬字符轉(zhuǎn)成系統(tǒng) ANSI 編碼即 GBK。MultiByteToWideChar和WideCharToMultiByte是 Windows APIVC6 完全支持不需要額外鏈接庫(kù)kernel32 默認(rèn)已導(dǎo)入。每次轉(zhuǎn)換都要先調(diào)用一次函數(shù)拿緩沖區(qū)長(zhǎng)度再分配內(nèi)存做第二次調(diào)用這是 Windows 編碼轉(zhuǎn)換的標(biāo)準(zhǔn)套路。注意返回值里的-1表示輸入字符串以 null 結(jié)尾函數(shù)會(huì)處理結(jié)尾字符你不需要手動(dòng)截?cái)唷?. 避坑實(shí)測(cè)記錄VC6 jsoncpp 的編譯期與運(yùn)行期暗礁6.1 鏈接錯(cuò)誤 LNK2005CRT 庫(kù)版本沖突現(xiàn)象工程編譯通過(guò)鏈接時(shí)報(bào)LNK2005 _malloc already defined in LIBCMT.lib有時(shí)還會(huì)伴隨LNK4098警告。原因jsoncpp 編譯成靜態(tài)庫(kù)時(shí)用的運(yùn)行庫(kù)選項(xiàng)和使用端工程不一致。VC6 的 C 運(yùn)行時(shí)庫(kù)有單線程/ML、多線程/MT、多線程調(diào)試/MTd、動(dòng)態(tài)鏈接/MD等模式靜態(tài)庫(kù)如果用了 /ML符號(hào)定義在 LIBCMT.lib 和 LIBCD.lib 里各有一份鏈接時(shí)就會(huì)沖突。解決在 jsoncpp 靜態(tài)庫(kù)工程和使用端工程里把Project - Settings - C/C - Code Generation - Use run-time library改成完全相同的選項(xiàng)。我一般統(tǒng)一用Debug Multithreaded做調(diào)試版Release Multithreaded做發(fā)布版。改完重新編譯兩個(gè)工程問(wèn)題消失。6.2 解析返回 false 且錯(cuò)誤信息指向第一行BOM 頭作怪現(xiàn)象用reader.parse解析從文件讀入的 JSON 時(shí)返回falsegetFormatedErrorMessages報(bào)line 1, column 1附近有非法字符但用文本編輯器查看 JSON 文件完全正常。原因JSON 文件被 Windows 記事本或其他編輯器保存成了帶 UTF-8 BOM 的格式文件頭部多出 3 個(gè)字節(jié)EF BB BFjsoncpp 解析器不認(rèn) BOM把它當(dāng)成非法字符。解決解析前對(duì)文件流做 BOM 檢測(cè)和剝離。讀文件后檢查前三個(gè)字節(jié)是否是0xEF 0xBB 0xBF是則跳過(guò)?;蛘哂胹td::ifstream打開(kāi)文件后先f(wàn)in std::ws不能跳過(guò) BOM BOM 不是空白符需要手動(dòng)處理。資源包里的讀文件函數(shù)已經(jīng)內(nèi)置了 BOM 剝離邏輯但如果你自己寫(xiě)解析函數(shù)記得加上。6.3 解析大文件時(shí)程序崩潰遞歸深度與內(nèi)存分配現(xiàn)象解析一個(gè)幾十層嵌套的 JSON 文件或者數(shù)組長(zhǎng)度超過(guò)幾千時(shí)程序直接崩潰沒(méi)有異常信息。原因jsoncpp 在舊版本里解析嵌套層級(jí)過(guò)深的對(duì)象時(shí)遞歸調(diào)用會(huì)導(dǎo)致棧溢出數(shù)組過(guò)大時(shí)append操作頻繁重新分配內(nèi)存VC6 的默認(rèn)堆管理器效率低而且容易產(chǎn)生內(nèi)存碎片。jsoncpp 對(duì)解析深度沒(méi)有硬限制但運(yùn)行時(shí)棧只有 1MB。解決一是限制 JSON 的嵌套層級(jí)設(shè)備協(xié)議里明確約定不超過(guò) 10 層二是解析前用Json::Reader::getFeatures()里的strictRoot選項(xiàng)把根節(jié)點(diǎn)必須是對(duì)象或數(shù)組這一約束打開(kāi)防止根節(jié)點(diǎn)是數(shù)字或字符串這種非法 JSON 被解析三是如果 JSON 體量很大改用Json::CharReader新版接口配合std::istream流式解析不要一次把整個(gè)文件讀入內(nèi)存。6.4 中文轉(zhuǎn)出來(lái)的 JSON 在設(shè)備端顯示成 UTF-8 亂碼現(xiàn)象本機(jī)解析和生成 JSON 一切正常但把 JSON 發(fā)到設(shè)備或上傳到 Web 服務(wù)端后中文變成一堆亂碼而且不是\uXXXX形式。原因數(shù)據(jù)在電腦和服務(wù)端之間傳輸時(shí)代碼用的是 GBK 字節(jié)串但沒(méi)聲明編碼服務(wù)端默認(rèn)按 UTF-8 解碼或者反過(guò)來(lái)。jsoncpp 在生成 JSON 時(shí)不會(huì)做轉(zhuǎn)義中文字符如果以原始 UTF-8 字節(jié)寫(xiě)入字符串值傳輸層再用 GBK 讀就亂碼。解決在 HTTP 或 TCP 協(xié)議頭里明確charsetutf-8并確保發(fā)送前字符串是 UTF-8 字節(jié)。排查時(shí)用一個(gè)十六進(jìn)制查看器看字符串的第一個(gè)字節(jié)0xE4開(kāi)頭是 UTF-8中文通常以 E4-E9 開(kāi)頭0xC4或0xD6開(kāi)頭是 GBK。資源包里的案例工程自帶這個(gè)排查工具函數(shù)打印每個(gè)中文字符的十六進(jìn)制值。6.5 用 StyledWriter 輸出后字符串被截?cái)嗷騼?nèi)容偏移現(xiàn)象StyledWriter寫(xiě)出的 JSON 字符串復(fù)制到別的編輯器里偶爾出現(xiàn)內(nèi)容偏移字符串值的末尾少了一個(gè)字符或者轉(zhuǎn)義符號(hào)被吞掉。原因VC6 的std::string和 C 字符串 API 混用。StyledWriter::write返回的std::string在寫(xiě)入文件時(shí)用了fwrite(str.c_str(), 1, str.length(), fp)但 c_str() 返回的指針可能在后續(xù)字符串對(duì)象析構(gòu)時(shí)失效如果你先保存了指針再用就等于野指針。解決凡是 Writer 的輸出一律立即用std::string的值拷貝到自己的變量里不要長(zhǎng)期持有const char*。寫(xiě)入文件的長(zhǎng)度用str.length()而不是strlen(str.c_str())因?yàn)?JSON 字符串內(nèi)可能包含\0轉(zhuǎn)義序列的存儲(chǔ)形式strlen會(huì)提前截?cái)唷_@些細(xì)節(jié)在 VC6 的老標(biāo)準(zhǔn)下特別容易踩現(xiàn)代 C 里 std::string 的優(yōu)化策略反而讓這些問(wèn)題不容易暴露。7. 最后的技巧把中文轉(zhuǎn)換封裝成工程級(jí)的全局工具收尾要落地一個(gè)能直接抄走的東西。資源包里已經(jīng)附帶了一個(gè)獨(dú)立的工具模塊叫encoding_util.cpp把 5.3 節(jié)里的 UTF-8 與 GBK 互轉(zhuǎn)函數(shù)封裝成了CEncodingUtil靜態(tài)類并且加了一個(gè)自動(dòng)識(shí)別函數(shù)傳入一個(gè)std::string先看字節(jié)特征判斷是否為 UTF-8是則轉(zhuǎn) GBK否則原樣返回。這個(gè)函數(shù)在調(diào)試串口設(shè)備數(shù)據(jù)時(shí)特別實(shí)用因?yàn)橛行┰O(shè)備的固件版本不同輸出的 JSON 編碼不統(tǒng)一用自動(dòng)識(shí)別可以少寫(xiě)很多分支判斷。std::string CEncodingUtil::AutoToGbk(const std::string input) { // 判斷是否為 UTF-8 編碼 bool isUtf8 true; const unsigned char* data (const unsigned char*)input.c_str(); int len (int)input.length(); int i 0; while (i len) { if (data[i] 0x80) { i; // ASCII 范圍直接跳過(guò) } else if ((data[i] 0xE0) 0xC0 i 1 len) { if ((data[i1] 0xC0) ! 0x80) { isUtf8 false; break; } i 2; } else if ((data[i] 0xF0) 0xE0 i 2 len) { if ((data[i1] 0xC0) ! 0x80 || (data[i2] 0xC0) ! 0x80) { isUtf8 false; break; } i 3; } else { isUtf8 false; break; } } if (isUtf8 len 0) { return utf8ToGbk(input.c_str()); } return input; }這個(gè)自動(dòng)識(shí)別函數(shù)不算百分之百準(zhǔn)確但對(duì)于常見(jiàn)的中文場(chǎng)景足夠。UTF-8 的多字節(jié)序列有嚴(yán)格的比特位模式GBK 的編碼空間和它有部分重疊極少數(shù)情況下會(huì)有誤判但概率極低。把這個(gè)函數(shù)放在公共模塊里所有項(xiàng)目共用一份比每個(gè) cpp 文件里各寫(xiě)各的轉(zhuǎn)換函數(shù)要靠譜得多。驗(yàn)證轉(zhuǎn)換是否正確的方法也很簡(jiǎn)單調(diào)用Json::StyledWriter把生成的 JSON 打印出來(lái)在 VC6 的 Output 窗口里如果中文顯示正常說(shuō)明內(nèi)存中的字節(jié)已經(jīng)是 GBK如果在 Output 窗口亂碼但文件內(nèi)容正常說(shuō)明是 UTF-8。也可以用資源里帶的一個(gè)小工具函數(shù)PrintHex把字符串每個(gè)字節(jié)的十六進(jìn)制打出來(lái)對(duì)照 ASCII 表查看E4 B8 AD是“中”的 UTF-8 編碼D6 D0是“中”的 GBK 編碼一眼就能分辨當(dāng)前串是什么編碼。資源包里所有的示例工程默認(rèn)已經(jīng)做了三件事源文件統(tǒng)一保存為 UTF-8 with BOM、工程編譯選項(xiàng)預(yù)置了_MSC_VER1200和JSON_NO_INT64、所有讀取 JSON 文件的入口都做了 BOM 剝離。你拿到手以后第一件事不是改代碼而是先跑通自帶的 Demo 工程確認(rèn)你的 VC6 環(huán)境和資源包配置一致再往自己的工程里遷移。從那以后我每次在 VC6 里接入 jsoncpp都強(qiáng)制自己先跑一遍編碼自檢函數(shù)再動(dòng)業(yè)務(wù)代碼這么多年再?zèng)]因?yàn)閬y碼翻過(guò)車。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
99热20| 五月开心婷婷| 中文字幕在线视频播放| 國語久久婷| 婷婷五月激情热播| 亚洲色图五月丁香| 五月丁香亭亭A片| 九九视频在线| 中文字幕,综合,91| 俺去也在线官网| 九九热re99re6在线精品| 国产毛多水多女人A片| 99毛片| 婷婷五月天成人影片| 秋霞性爱AV| 性欧美大战久久久久久久83| 超碰人妻在线| 深爱五月激情| 日韩欧洲亚洲| 五月婷婷之美女图片| 婷婷五月综合色拍| 久久青青日本视频| 久久婷五月影院| 天天精品视频免费观看| 色婷婷六月丁香综合欲精品| 天天草天天日| 久久五月天黄色五月天色网址| 亚洲天堂色| 天天久久狠狠色综合| 狠狠色婷婷六月激情网| 婷婷五月综合激情小说| 亚州精品色情在线观看| 激情综合网五月在线播放| 超碰在线免费观看3 9| 欧美在线视频9| 91人碰| 天天操天天谢| 久久99成人性爱高清视频| 9久久精品| 久久婷婷丁香视频网| 黄急一级视频| 黄色网址五月婷婷| 91久久久久| 婷婷激情五月天激情小说| 大香蕉人妻| 欧美天天干天天草| 人妻精品久久久久久久| 日本色天堂| 无码人妻精品一区二区蜜桃色欲| 婷婷久久大香蕉| 天天色天天日| 激情五月丁香五月| 久久精彩视频| 伊人在线视频| 婷婷丁香熟女| 亚洲人成网站999综合| 亚洲亚洲人成综合网络| 99热传媒| 天堂网色色| 色欲AVV| 国产精品久久久爽爽爽麻豆色哟哟| 国产色色视频| 天天色情站| 99热官网| 2050人人操免费工开爱 | 激情内射p| www。五月天。com| 狠色色狠网| 五月丁香| 天天天天干| 九九热在线99| 久久婷婷综合五月| 538任你爽视频不一样的| 无码九九九九| 久思思热视频在线观看| 日韩综合大黄| 97碰久久| 婷婷香五月天| 欧美成人猛片AAAAAAA| 黄桃AV无码免费一区二区三区| 人妻丰满精品一区二区A片| 五月天开心网| 99精品成人无码A片观看金桔| 丁香五月天视频| 欧美婷| 黄色笑话深爱激情网丁香五月婷婷啪啪啪啪啪 | 婷婷六月丁| 1024日韩| 91大操| 国产a视频| 大香线蕉伊人| 开心四月婷婷在线色播播| 欧美熟女乱又伦| AV片在线观看| 亚洲精品亚洲人成人网| 思思热热久久| 色播五月丁香| 婷婷在线五月综合| 婷婷午夜激情| 99爱免费视频在线观看| 欧美性爱一区| 中文av网站| 欧美婷婷五月丁香| 婷婷色综合| 日本网站久久| 五月婷无码| 曰日爽日日操| 色狠狠色噜噜AV天堂五区| 九九色网专区| 99热无码精品| 亚洲成人在线播放| 五月社区婷婷激情| 色五月激情网| 久9热插入| 停停五月色宗合| 色欲久久久久久综合网综合网| XX色综合| 色噜婷婷| 激情小说五月天社区丁香| 噜一噜免费视频| 黄色笑话深爱激情网丁香五月婷婷啪啪啪啪啪 | 国产91视频| 五月丁香久久| 色爱综合五月| www.思思99热| 五月丁香六月| 久久久久激情| 99热国产这里只有精品| 夜夜爽77777妓女免费下载| 丁香婷婷老司机久操| 成人午夜无码视频| 久久综合影院| 91欧美日韩| 久久婷婷热| 五月停停丁香| 激情五月天婷婷播播久久综合91| 丁香五月综合激情啪啪| 丁香六月婷| 免费黄网不卡AV| 激情四射五月天| 无码色色| 日本色色影院| 高清无码视频网址| 色五月婷婷天堂| 久操人妻| 丁香婷婷久久五月天| 丁香五月欧美成人| 99免费热视频在线| 丁香五月停停基地| 在线,国产,色,热视频| 无套内射极品大美女| 成人av免费观看| 久久丁香五月| 天天五月丁香五月| 色综合色色| 婷婷免费视频| 色色色色色色网站| 国产小网站| 久久机只有这里精品| 在线不卡视频| www婷婷| 人人干av| 99五月婷| 精品网站:999WWW| 丁J香六月首页| 五月丁香狠狠爱婷婷综合| 激情六月天婷婷| 色级婷婷| 日韩精品一品二区三区的使用体验| 五月婷婷激情四月| 91干婷婷| 激情亚洲婷婷六月| 久久久国产精品黄毛片| 色婷婷六月丁香综合欲精品| 久色激情| 欧美搡BBBBB摔BBBBB| 丁香六月婷婷综合麻豆| 五月天丁香啪啪啪啪| av五月天婷婷丁香| 激情AV在线| 伊人网碰碰| 97人妻碰碰碰久久香蕉| 丁香婷婷色五月| 五月丁香婷婷在线| 色婷视频| www.91.com处女在线直播| 久久激情网| 国产噜一噜天天噜| 国产日韩欧美| 久久婷婷在线| www.精品久9| 五月天婷婷成人网| 久久久婷婷| 六月激情婷婷| 成人欧美一区二区三区在线观看| 一区二区成人电影免费播放| 免费不卡狠操美女视频网| 五月婷婷丁香综合,亚洲天堂| 亚洲AV成人无码久久精品老人法拉利| 伊人久久中文网| 婷婷丁香五月天激情| 伊人久热91| 婷婷性爱综合| 狼友超碰| 五月天三级| 日韩色色色色| 人人爱摸视频| 一个色的综合| 五月刺激丁香月综合| 婷婷爱五月天人人爱| Www.Av网9| 日本va欧美va国产激情| 久九色| 人妻久久久久久| 五月天开心婷婷久久 | 色综合久久88色综合天天| 丁香六月成人| 91丨九色丨大屁股| 99热热热天天人人人超超碰| 丁香色六月婷婷| 久久这里精彩免费在线观看| 亚洲成AV人片在线观看| 九热...av| 五月激情丁香六月狠狠干| 中字幕视频在线永久在线观看免费| 久热视频这里只有精品68| 色情激情五月婷婷| 色色色热热热| 色屌丝中文字幕| 99热最新| 亚洲国产成人AV在线| 亚洲精品在线视频| 激情综合网激情五月网| 丁香婷婷色| 欧美大片| 99精品热| 国产视频福利| 中文av网站| www国产亚洲色婷婷com| 丁香五月综合高清在线| 热九九九九| 激情五月天婷婷| 丁香六月成人网| 亚洲色图81p| 亚洲国产无线乱码在线观看| 色色五月天网站| 第二色AⅤ| 久久久五月天婷婷| 丰满少妇猛烈A片免费看观看| 天天摸天天舔天天天天爽| 99热国产精品| 国产性爱一级| 五月丁香A片| 夜夜谢天天干| 五月婷婷六月丁香综合| 九九热在线精品| 99色色网| 欧美性猛交99久久久99| 啪啪啪丁香五月| 色九月婷婷| 五月天激情网开心网| 天天情天天狠天天透| 婷婷桃色网| 日本三级日本三级99| 99看片| 五月天另类综合网| 99视频色在线观看| 玖玖爱伊人| 婷婷五月天最新网址| 五月天激情小说| av在线中文| 99五月香婷婷丁香在线视频| 亚洲成人免费电影| 99热免| 丁香五月社区| 99视频在线| www激情网| 这里只有精品偷拍| 亚洲成人av在线播放| 狠狠干五月| 婷婷综合五月| 另类激情综合| 久久在这里99| 超碰日日操| 婷婷五月天在线观看免费| 精品一区二区三区四区五区六区介绍| 激情综合五月| 5月激情天| 99男人天堂| 丁香五夜激情四射夜夜夜| 免费看欧美成人A片无码| 99热99在线| 婷婷综合精品| 9久久精品| 婷婷久久丁香五月| 99碰超| 人人97碰| 99免费| 五月婷婷av| 久久九区| 中文字幕永久在线| 国外亚洲成AV人片在线观看| 日韩青青| 中文字幕精品推荐免费在线观| 乱乱av| 亚洲熟妇AV乱码在线观看| 热热久久久久久久久| 色六月丁香婷婷啪啪啪| 久久婷婷六月| 黄页大全十八禁| renre人人操国产超碰在线| 亚洲精品乱码久久久久99| 新久久五月天激情| 亚洲色小说在线综合| 五月婷婷久久网| 呦呦视频无码播放| 五月婷婷丁香网| 亚洲成人五月| 97干在线| 国产亚洲精品久久久久苍井松| 偷偷与邻居做爰完整视频| 疯狂做受XXXX高潮A片| 久久精品99国产精品日本| 成人无码精品1区2区3区免费看| 五月天天天色| 91人在线观看| 色99婷婷五月天| 成人综合AV| 在线观看的av| 丁香婷婷久久激情| 五月婷婷丁香瑟瑟视频| 五月丁香啪啪激情| 三十熟女| 操日本三片99| 99热国产在| 伊人婷婷五月| 婷婷五月色综合| 99爱精品| 久久婷五月影院| www.久久爱.c n| 婷婷啪啪| 五月深爱激情网| 婷婷五月在线视频| 亚洲综合视频一下| 伊人网色婷婷五月天| 天天天综合网| 丁香婷婷激情| 亚州色综合| 久99久视频| 丁香婷婷丁香五月欧美人| 五月婷六月丁香| 久热69| 五月婷视频| 亚洲天堂青草| 天天做天天爱天天搞| 五月婷婷综合色啪首页| 另类激情综合| 91丁香综合| 久久99精品日本| 久久性爱视频免费| 久久久久亚洲AV无码网影音先锋| 久久97久久99久久综合欧美| 91色在线/日韩| 丁香五月骚喷水视频| 综合五月婷婷| 无码少妇高潮喷水A片免费| 四虎99热在线观看网站| 丁香五月天天哦| 都市激情小说婷婷| 九九热最新| 91九色无码内射| 婷婷综合五月天| 天天天日天天天干| 成人欧美日韩| 伊人五月婷婷国产视频| 婷婷5月天av| 91狠狠色色丁香婷婷综合久久| 色五月婷婷丁香五月| 97日本操| 99热这里只有精品亚洲| 激情综合五月婷婷丁香| 大香蕉在线99热| 九九Av| 99久在线精品99re8热| 五月天第四色开心色播| 五月婷婷成人| 久久婷婷五月丁香蜜桃网| 97视频久久| 五月丁香在线看| 激情综合五月| 五月丁香色色网| 色色色综合色| 啪啪啪丁香五月| 欧日韩AV| 天天色播| VA五月激情在线| 色婷婷精品视频| 九色成人AV在线| 99区视频| 99热久久这里只有精品| 色五月丁香五月激情五月激情| 日本在线99| 色九九中文字幕| 99久热这里有精品| 亚洲激情在线| 国产婷婷五月中文字幕高清| 色婷婷综合网站| 999婷婷综合| 欧美成人精品A片免费一区99| 国av网| 操逼在线视频| 亚洲爆乳无码精品AAA片蜜桃| 天天摸天天肏| 99性色| 久9久9久9久9久9久9| 国产美女视频久| 99热在线网站| 成人va视频| 中文字幕欧美精品久久| 欧美成人性爱网| www.ywav| 色情五月综合婷婷| 久色五月天| 五月丁香六月色| 99热6色| 色婷婷玖玖影院| 亚洲婷婷五月天激情| 91碰操| 天天爽天天摸人妻综合网| 婷婷婷婷婷婷婷婷婷婷丁香| 战争与艾拉电影免费观看| 日韩黄色中文字幕| 日日日日操| AV中文字幕夜夜操b天天摸bb| 五月婷婷激情四月| 婷色视频| 天天操天天曰| 伊人成人宗合网| 亚洲乱码日产精品BD| site:hcxsz888.com| 婷婷成人视频| 久久这里只有精品网| 欧洲MV日韩MV国产| 玖玖资源在线视频| 成人片在线免费看| 亚洲成人高清在线| 激情q青青草在线婷婷| 丰满少妇乱A片无码| 这里只有精品视频看看| 婷婷久久女人| 久久婷婷视频| 激情综合激情五月| 日本理论久久| 亚洲视频99| 色亭亭五月天网扯| 99在线综合视频| 精品爆操| 五月丁香亭亭成人电影| 色吧网综合| 狠狠五月天| 婷婷五月天奸女| 日韩啪啪视频| 婷婷中文字幕版| 天天操夜夜操| 色综合色| 色丁香五月天射婷婷爱婷婷| 激情综合丁香六| 99热这里只有精品一| www.9色色色| 26uuu精品一区二区| 好看的国产精品| 亚洲性爱干干| 丁香婷婷浪潮AV久久综合| 久久综合五月| 久久这有这里精品| 日hao1区| 乱岳熟女50岁| 丁香六月激情| 99日这里只有精品| 色六月丁香婷婷啪啪啪| 丁香久久激情俄| 午夜一区| 五月婷在线播放| 五月丁香成人网| 中文字幕操比影片| 婷婷五月丁香基地| 欧美日本va| 亚洲成人av在线| 五月色情| 人人操av| 五月丁香激情综合啪啪| α久久| 久久狼人天堂| 天天操精品| 人妻丰满精品一区二区A片| 久久五月婷婷丁香| 色婷婷六月天在线| 新99色色色色色色| AV在线观看网站| 激情六月婷婷啪啪| 激情久久久| pacopacomama 070722_670 素人奥様初撮りドキュメント 103 大久保純子 | 丁香婷婷色| 丁香五月婷婷激情视频播放| 久久五月婷婷电影| 亚洲综合另类| 亚洲欧美日韩另类| 97精品人人A片免费看| 婷婷五月天激情电影| 亚洲人妻一区二区| site:wpjngj.com| 97婷婷在线| 五月婷综合网| 精品婷婷五| 91肏| 久久超级碰视频| 国产毛多水多女人A片| 99热精品在线播放| 五月天自拍视频| 超碰99在线| 婷婷五月,偷窥偷拍网| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 91vip在线观看| www网站在线观看| 99久久国产宗和精品1上映| 色五月婷婷久久| 精品草原久久视频| 狠狠五月激情婷婷直播片| 99re这里只有精品国产99| 婷婷五月电影院| 99热费观看| 美女91一起草| www亚洲无码| 另类婷婷五月天啪帕帕| 国产高潮A片羞羞视频涩涩| 日日夜夜婷婷| 婷婷亚洲综合| 六月丁香啪啪| 亚州美女| 五月天网址在线刘玥| 九九黄色网| 思思精品视频| 色婷久久| 国产特级毛片AAAAAAA高清| 99热免费| 激情綜合W W W,激情五月天| 五月婷在线观看| 五月丁香天堂网| 久久综合九九| 久久激情网| 五月丁香六月天| 五月婷婷综合视频| 婷婷色在线| www.狠狠操| 性做久久久久久久免费看| 狠狠干狠狠干| 久操乱| 久久久亚洲成人无码A片| 丁香九月激情在线视频| 久久久久久18| 狠狠第四色| 在线中文字幕av| 亚洲操逼网| 任你艹| 91丨九色丨大屁股| 丁香六月啪| 最近中文字幕大全免费版在线 | 五月丁小婷婷激情四射| 欧美婷婷综合网| 婷婷综合网性| 色婷婷99| 思思综合热| 九九爱激情| 国产亚洲色婷婷久久99精品91| 久99视频在线观看| 疯狂做受XXXX高潮A片| 久久综合九色综合88i| 婷婷婷久久久| 色色婷五月天| 美国十月色婷婷在线观看| 激情五月六月婷婷| www.99精品日操伊人乱碰在线| 亚洲操B视频| 超碰人人草| 99久久思思| 丁香五月婷婷激情123| 日本颜色视频人人爱| 激情綜合W W W,激情五月天| 在线观看亚洲视频影院| 噼里啪啦完整版中文在线观看| 色天使色综合| 亚洲天堂99| 亚洲色欲AAAAAA| 噜噜噜久久| 五月丁香婷婷色| 五月天婷婷色综合| 婷婷五月天AV在线| 色欲丁香久久| 六月丁香综合| 99综合五月免费视频色婷婷| 天天综合网91| 久草xx性爱视频| 日本综合色色| 女同在线9| 九热精品| 婷婷综合色播网| 婷婷狠狠干| 国产av第一专区| 欧美日韩成人在线| 色五月天成人| 极品人妻VIDEOSSS人妻| 国产成人高清| 五月激情网站| 91超级碰碰| 北京熟妇搡BBBB搡BBBB| 超级碰碰碰97免费| 丁香六月亚洲综合| 五月天成人在线视频网站| 91九色 熟| 狠狠操天天操天天操| 五月丁香六月成人| 久久99免费视频| 亚洲尤物在线| 99热9| 97狠狠色| 色狠狠999综合| 五月色亭丁香| 99久久久国产精品免费蜜乳tv| 九九色热| 五月天婷婷基地丁香| 色色色婷婷五月| 色射7856五月天激情四射| 深爱五月天 开心网| 国内外色色色色色成人视频| 五月丁香婷婷基地| 熟女网站久久| 丁香五月色五月| 日日夜夜狠狠操| 日韩青青| 亭亭五月天黑人2014| 日本猛少妇色XXXXX猛叫| 久久激情视频| 久久视频这里有精品99| 武则天精品久久| 91成人看片| 婷婷性爱视频在线| 五月丁香色六月激情干大屄| 日韩AV在线免费| av五月天婷婷丁香| 日韩有码一区| 狠狠草狠狠草| 丁香六月青青草| 五月天婷婷在线AN| av五月丁香婷婷网| 婷婷五月天久久| 91精品国产色猫| 这里只有精品1| 91九色在线观看免费| 2025色婷婷| 任你干嘛免费视频播放| 这里只有精品视频在线| 色伊人啪| 99爱这里只有精品免费视频| 五月婷婷新网站| 婷婷五月天福利| 亚洲性爱干干| 国产成人AV不卡| 亚洲精品五月| 国产性爱色| 久久人妻人人| 美女激情综合| 五月天色综合| 亚洲色小说在线综合| 九月丁香婷婷基地| 激情五月婷婷开心网| 久久婷婷激情四射五月天| 丁香综合婷婷五月天| 丁香六月婷婷综合欧美| 婷婷六月久久综合导航| 亚洲一区二区无遮挡A片| 激情五月深爱婷婷| 狠狠色大香蕉| 99热这里只有精品3| ,99视频久久| 丁香五月狠狠在线观看| 能直接看的av网站| 久久婷婷网| 天天综合精品| 久久人妻伦理| 97人凄人人操人人爽| 色99视频| 精品成人a v无码内射| 成人婷婷| 无码成人AAAAA毛片AI换脸| 午夜五月天| 97干97色| 欧美日韩欧美| 色色色婷婷| 日韩成人精品一区久久久久| 野战J办公桌椅H| 俺去也在线www色官网| 亚洲AV无码一区二| 99操逼| 丁香久久综合| 国产精品激情AV久久久青桔| 五月天婷婷社区| 婷婷五月丁香av网站| 大香蕉久久综合网| 国产精品成人AV在线| 五月天六月天| 色五月婷婷激情基地| 丰满人妻一区二区三区| 天天操夜夜橾| 精品色情一区二区三区四区| 色色色天堂网| 99精品偷自拍| 99色精品| 五月停停丁香| 婷婷六月丁香激情| 操比激情五月| 被男人添B超爽视频| 99热这里只有精品在线观看| 天天爽天天弄| 色婷婷www| 影音先锋男人av资源站| 婷婷综合五月| 丁香五月色网| 99免费视频在线观看爱| 婷色人人狠| 亚洲午夜Av| 国产精品天天狠天天看| 99热精品在线播放| 中文av网站| 人人干人人操人人摸人人做| 亚洲综合五月天婷婷丁香| 亚洲区在线| 色色五月婷婷| 人妻av在线| 丁香五月六月综合欧美| 九九色99| 欧美色骚婷婷五月天| www.婷婷五月天| 夜夜AVV| 狠狠干最新地址| 久久九色| 日本久久天堂| 人妻aV在线| 777色色色| 99热这里只有精品1998| 另类五月婷婷| 五月天婷婷激情网| 大香蕉网站,大香蕉综合| 国产a视频| 日本久久激情| 国产偷人爽久久久久久老妇APP| 激情綜合W W W,激情五月天| 五月综合激情| 丁香婷婷九月| 丁香婷婷六月男男| 26uuu国产激情视频| 欧洲亚洲欧洲99久久| 色情·com| 日本老女人黄页在线播放| 91成人看片| 久久玖玖综合| av线电影| 狠狠色丁香婷婷五月| 九九99视频精品| 久综合4| 五月婷婷很很色| 天天揷综合网| 国产性av| 婷婷综合仓库中文| 亚洲春色奇米影视| 天天揷综合网| 碰碰碰97国产| AV在线免费观看不卡| 久久六月婷婷| 婷婷五月综合中文字幕| 男同色五月开心五月激情五月| 99re欧美精品| 婷婷五月精品| 五月花激情网| 激情五月婷婷视频一区二区三区| 久久久久婷 | 五月天丁香成人社| 琪琪色五月天| www.久久爱| site:pnnrt.com| 中文字幕成人| 国产成人AV| 欧美十二区| 中文字幕成人日韩| 九色地址91视频| 综合激情五月婷婷| 91婷婷丁香| 婷婷五月天激情文学小说| 丁香五月AV综合| 久久五月天激情视频| 丁香五月婷婷乱| 激情五月狠狠| 久久婷婷五月综合啪| 爆乳熟妇一区二区三区爆乳照片| www.99视频| 国产肥白大熟妇BBBB视频| 欧美日韩成卜| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 2018国产大陆天天弄| 五月丁香婷婷成人网| 色婷婷狠狠禁久久| …亚洲黄色在线播放日韩、av中文a…| 97人操人免费视频| 亚洲精品va| 色五月婷婷DVD| 色综合伊人网| 能直接看的av网站| 91打屁股免费看| 绿色小导航AV| 好好干Av| 日日操日日爽| 成人电影在线免费试看| 中文字幕成人| 丁香影院五月综合| 亚洲天堂啪啪| 日韩一区二区三区无码| 99re热视频这里只精品5| 性天堂久久| 色婷婷激情| 五月婷婷黄色毛片| 九九热这里只有精品556| 狠狠色激情综合| 午夜婷婷久久| 熟妇无码乱子成人精品| 热996精品在线观看| 99久久综合| 五月激情婷婷女| www.丁香五月| 91在线97视频| 国产一级片| 五月婷婷丁香色播网| 色色丁香五月天| 激情婷婷丁香五月| 人人人操| 狠狠色婷婷六月激情网| 99日韩| 免费一区二区三区| 久久综合婷婷| 影音先锋777xfplay色资源网站| 丁香五月电影| 久久人视频| 亚洲色色爱| 色五月大| 亚洲丁香五冃97色| 狠狠操狠狠爱| 五月丁香888| 天天日夜夜B久久| 色5月丁香婷婷| 操人妻AV| 久久婷婷青草五月天| 婷婷色正月| 蜜桃人妻无码AV天堂三区| 婷婷色操| 五月草影视| 国产精品色色| 欧美影院婷婷| www夜夜| WwW色婷婷| 色婷婷综合久色AV五色最新| 天堂久久性| 色99久草在线| 日本ww亚洲| 超碰在线91| 色婷婷影| 99色亚洲| 狠狠色丁香乆乆| 久热这里这里有精品| 婷婷丁香九月| 日韩美女在线视频19| 五月婷婷影视| 久热99| 五月婷婷啪| 五月婷婷视频| 黄色短视频在线观看| 丁香五月狠狠综合欧美| 另类小说五月天| 日韩色五月| 丁香五月婷婷AV在线| 8050一级网| 天天操夜夜玩!| 婷婷五月天小说| 五月婷丁香| www.婷婷五月天.com| 成人免费高清在线播放| 婷婷婷婷婷婷婷五月丁香| 曰韩少妇内射免费播放| 天天摸天天舔在线视频| 热99在线| 五月婷五月婷伊人伊人五月婷| 色婷婷A| 五月天婷婷社区久久综合| 丁香五月婷婷在线观看| 五月婷婷婷色| 性生活视频98791| 色婷婷狠狠禁18久久| 天天拍夜夜爽| 亚洲综合网在线| 五月丁香网中文字幕| 日日夜夜狠狠| 九九视频这里是精品五月| 99热综合网| 三级黄网站| 久久视频这里有精品99| 丁香五月婷婷啪啪| 天天干天天操天天拍| 激情五月婷婷丁香六月| 婷婷社区五月天| 久久婷婷五月国产色综合激情| 国产这里只有精品| 人人色人人摸人人看| 99亚洲精品| 99er6| 亚洲精品无人区| WWW.桔色成人.COM| 碰超亚洲| 狠狠干夜夜干| 操人久久| 婷婷午夜天| 精品久久人妻热| 99在线精品免费视频| 俺去也在线视频| 亚洲激情六月| 综合狠狠干| 激情综合色| 免费看欧美成人A片无码| 伊人成人宗合网| 亚洲av另类在线观看| se99视频| 久久九九@| 91精品综合久久久久久五月丁香| 女人高潮内射99精品| 色爱综合视频| 91re色综合视频| 五月丁香激情综合久久| www.99热在线观看| 久久精彩视频| 丁香婷婷六月激情综合| 1024在线视频| 久久久激情视频| 色色色在线免费视频| 久久婷婷五月天丁香| 这里只有精品无码| 大香蕉五月天婷婷| 五月丁香六月激情| 九九无码视屏| 五月婷婷啪啪啪| 国产av天堂| 五月丁香六月婷婷综合网站| 中美日韩成人在线| 成人无码精品1区2区3区免费看 | 九九aV| 国产成人精品一区二三区熟女在线 | 九九热这里只有精品6| 秋霞电影理论| 97久久久免费福利网址| 天天色天天操天天射| 婷婷丁香五月天亚洲| 色色色色色色色色色色色色色97| 亚洲在线视频321| 久久这里面只有精品视频| 狠狠色噜噜狠狠狠777奇米| WWW免费视频碰碰碰碰| 亚洲中文无码成人| 激情五月天福利| 天天插综合| 欧美激情综合色丁香婷婷五月天| 色五月综合在线| 亚洲精品a成人在线播放| 99热天堂| 人人看人人要| 婷婷伊人网| 婷婷丁香精品视频在线观看| 99无码视频| 五月天五月天激情网| 99久久免费性爱视频`| 97碰 在线视频观看| 99色色视频| 六月激情久久| 丁香五月综合福利视频导航| www.97干视频| 五月婷婷丁香91| 色婷婷基地| 成人丁香婷婷| 色五月 激情婷婷 综合五月天| 天堂色色色| 精品久热| 婷婷六月久久| 久久色婷婷| 蒲京久久无码视频| 99碰碰| 深爱激情五月天| 99视频精品8| 久久婷五月| 色婷婷玖玖影院| 精品香蕉99久久久久网站| 色欲天天综合| 亚洲精品午夜国产va久久成人| 中文人妻主播久久| 99re在线精品视频| 九九Y精品热播| 极品少妇高潮啪啪AV无码| 大香蕉天堂| www五月天com| 久久66精品| 九九爱这里只有精品| 色狠狠色综合久久久绯色AⅤ影视| 人妻激情久久| www.天天干| 日韩啪啪视频| 色婷婷五月天在线观看| 996热re视频精品视频这里| 狠狠色婷婷7| 五月天久久婷婷| 亚洲顶级VA在线观看-高清完整版在线影院观看-S022AV | 2025天天爽天天摸| 久久五月天激情美女| 九九热自拍| 久久久五月天网站| 91日婷婷在线| 丁香花社区av| 韩日另类| 99精品偷自拍| 黑人糟蹋人妻HD中文字幕| 亚洲最大视频| 欧美日韩成人| 九九香蕉网| 亚洲视频二区| 干一干xxxx| 亚洲欧美婷婷五月色综合| 思思re99视频在线观看| 99热这里只有精品官网| 丁香五月在线视频黑人| 五月婷成人网| 五月激情网五月综合网| 丁香 婷婷五月| 97五月天婷婷午夜| 亚洲视99| 五月激情五月丁香| www.狠狠操.co m| WWW、日本色丁香co m| 亚洲网站在线鸭子av| 婷婷六月激情小说网| 99久热在线精品| 婷婷五月小说色综合| jiujiu热在线视频| 婷婷她六月天| 欧美日本综合网| 激情综合5月| 色五月婷婷狠狠撸| 久婷久婷激情肉| 日本九九视频| 丁香九月婷| 人人草公开操| 久这里只有精品99| 怡红院99| 丁香婷婷五月六月天| 激情图片婷婷| 色人妻五月| 天天天综合网| 丁香六月亭亭久久综合| 99精品视频网站| 久久精品系列| 五月香婷婷| 精品乱码久久久久| 99久热| 久久久天堂国产精品女人| 国产精品色情AAAAA片软件| 激情婷婷五月丁香啪啪啪| 九九中文色色| 色婷婷色| 91九色在线| 国产色色网站网址| 五月天基地| 亚洲色优| 色婷婷电影| 国产成人片| 色欲AVV| 久9免费视频| 他改变了拜占庭| 情情五月天色| 直接看的AV| 日本片日本片祼观看网站在线看中文版网页在线看| 激情五月丁香五月| 熟妇无码乱子成人精品| 婷婷五月综合中文字幕| 99色在线观看视频| 久久久中文| 亚洲 小说 欧美 激情 另类| 月婷婷婷婷五月| 超碰人人操在线| 精品亚洲国产成AV人片传媒| 亚洲影院婷婷色| 香蕉中文在线| 免费AAAAA网| 久热这里只有精品在线| 九月婷婷色色| 人妻AV在线| 丁香五夜激情四射夜夜夜| 91久久| 久久五月天激情视频| 五月婷婷亚洲| 黄网在线播放| 激情五月天福利| 成人免费高清在线播放| 五月天播播| 野战J办公桌椅H| 亚洲超级碰| eeuus五月婷| 色婷婷丁香香香蕉视频| 综合色色网| 久操香蕉| 熟女国产在线一区二区三区四区| 婷婷精品视频| 操逼棍操逼| 丁香六月在线| 人妻激情久久| 91狠狠色丁香婷婷综合久久精品| 热99精品视频| 东京热伊人| 大香蕉福利导航| 色综合夜夜| 激情五月天电影| 99精品热| WWW·色色色·COM| 丁香五月天婷婷久久| 天天操综合网| 日韩精品一区二区三区,四区,五区视频| 国产免费av在线| 五月天婷婷伊人| www.婷婷五月天| 色色网站日本91| 九九热视频精品2| 丁香五月 六月婷婷首页| 97资源欧美日韩大香蕉超碰一区| 婷婷香蕉精品| 色噜噜狠狠色综| 丁香婷婷视频在线| 538在线精品| 任你草| 激情丁香五月婷婷| 日本不卡高字幕在线2019| 91久久99久久91熟女精品| 久久久久久久久人妻| 婷婷丁香五月综合| 久99在线视频| 婷婷婷婷色| 一级AV片| 激情综合网丁香| 欧美视频五区| 色九月综合网| 久8色色| www.99色| 另类图片天天影视在线观看| 五月丁香啪啪| 亚洲亚洲人成综合网络| 午夜丁香| 97热精品| 婷婷99丁香| 九九机热| 成人αV视频免费观看| 丁香五月婷婷啪| 美日韩成人| 六月丁香狠狠爱| 人人射人人高潮| 久久性都花花世界成人免费视频| 婷婷五月天少妇| 婷婷五月天开心网| 91综合国免费久入| h亚洲| 狠狠色丁香久久婷婷综合五月| 日逼免费视频 | w婷婷五月婷婷w| 99视频这里有精品| 北条麻妃伊人 | 亚洲色婷婷五月天| 亚洲正能量欧美| 婷婷五月天首页| 色99综合色88| 成 久久| 亚洲最大成人综合网720P| 操操人人| 亚洲AV成人精品日韩在线播放| 91九色熟女| 自拍偷窥99热| WWW·色色色·COM| 六月激情久久| 婷婷va| 亚洲天堂大香蕉| 色狠狠综合入口| 五月丁香婷婷欧美| 91九色国产熟女| 91操片| 久久激情视频99| 亚洲欧洲另类| 日日噜狠狠色综| 色婷婷丁香A片区毛片区女人区| 99爱免费在线观看| 97色色网| 中文字幕 久久9999| 亚洲传媒在线观看| 思思热精品在线观看| 久久久日韩特色特黄AAAA| 婷婷婷婷婷开心无码播放| 欧美婷婷丁香五月| 射区导航| 天天综合网91| 99热这里全都是精品| 激情深爱婷婷网| 激情五月婷婷| 5月丁香六月婷婷| 伊人大香蕉综合在线| 91九色在线视频| 欧美色婷婷| www.五月.com| 日日操,日日爽| 七七色综合| 午夜成人综合| 久久久婷| 欧美在线| 深夜激情网| 99欧州偷拍视频| 综合久| 99re思思热这里| 丁香六月av| 日本人妻A片成人免费看片| 五月丁香怕怕综合| 五月天天丁香婷婷| 丁香六月婷婷综合啪啪| 色私五月婷婷| 丁香六月婷婷| 久久久久思思热| 日本色色网站| 五月丁香影院| 五月草影视| 人人操插| 日韩无码专区| 26uuu欧美日本| 超碰人人草| 色婷网站| 九九久久99精品免费观看www| 激情综合在线观看| 国产成人精品一区二三区熟女在线| 欧美婷婷五月| 九九这里是免费的视频5| 日产精品一线二线三线芒果 | 九九视频在线观看视频6| 99无码黄色视频| 噜噜噜噜噜久| 激情五月四色| 国产 亚洲 在线| 亚洲精品五月| 9l视频自拍九色9l视频自拍九色9l社区| 久久小视频| 婷婷伊人网| 五月婷免费视频久久久| 丁香五月婷婷色偷偷| 久久免费精彩视频|