亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

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

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

VC6.0下jsoncpp配置與中文亂碼處理:編譯選項(xiàng)與編碼轉(zhuǎn)換實(shí)踐 簡介面向 VC6.0 開發(fā)者的 JSONCPP 集成資源針對在 Visual C 6.0 環(huán)境下解析、生成 JSON 時常見的中文亂碼問題提供了完整的案例工程與可直接運(yùn)行的程序。壓縮包共 72 個文件整體 3.77MB以頭文件h、源碼cpp、內(nèi)聯(lián)模板inl為核心附帶工程文件dsp/dsw、界面資源rc/ico以及編譯輔助文件obj/sbr并包含一份【重要】使用說明文檔和必讀文本。已有 590 人學(xué)習(xí)下載資源內(nèi)置 jsoncpp-src-0.5.0 源碼無需另行編譯庫文件加入工程即可使用。具體內(nèi)容包括完整的 VC6.0 對話框/控制臺測試案例、中文 UTF-8 編碼處理配置、JSON 解析與序列化的可運(yùn)行演示以及排錯思路。通過使用說明文檔可快速掌握在 VC6.0 中規(guī)避中文亂碼、穩(wěn)定處理 JSON 數(shù)據(jù)的方法對維護(hù)舊系統(tǒng)或?qū)W習(xí)早期 C 項(xiàng)目集成的開發(fā)者尤為實(shí)用。1. 給 VC6.0 補(bǔ)上 JSON 解析能力為什么首選 jsoncpp早該被淘汰的 VC6.0 依然在工控、教學(xué)和存量維護(hù)項(xiàng)目里大量存在而 JSON 已經(jīng)成為設(shè)備接口和配置文件的默認(rèn)交換格式。在 VC6.0 上解析 JSON 有個天然痛點(diǎn)這個古董編譯器只支持 C98 的早期子集很多現(xiàn)代 C 庫根本編不過更不用說 STL 的 wchar_t 支持和編碼處理在 VC6 上表現(xiàn)得極其別扭。jsoncpp 是少有的、能在這個環(huán)境下穩(wěn)定編譯的 C JSON 庫而且它開源、單包可移植、API 足夠直觀適合嵌入式設(shè)備調(diào)試工具和 Windows 老項(xiàng)目里做配置讀寫。這份資源的價值在于把 jsoncpp 的源碼包、工程配置、各種解析和生成案例全部打包好并且專門對中文亂碼做了預(yù)處理拿到手不用再去網(wǎng)上東拼西湊找兼容補(bǔ)丁適合做設(shè)備聯(lián)調(diào)、寫上位機(jī)工具、維護(hù)老系統(tǒng)的從業(yè)者。2. 搭建 VC6.0 的 jsoncpp 環(huán)境頭文件、靜態(tài)庫與工程選項(xiàng)2.1 編譯前的準(zhǔn)備源碼里挑對文件別一股腦全編進(jìn)工程jsoncpp 的源碼從 GitHub 上下下來是一整個倉庫但 VC6.0 的工程不需要那么多文件。我一般只挑src/lib_json目錄下的json_reader.cpp、json_writer.cpp、json_value.cpp三個實(shí)現(xiàn)文件以及include目錄下的json/頭文件目錄。其他如json_tool.h、json_batchallocator.h是這三個文件內(nèi)部依賴的輔助頭不需要額外加入工程編譯時自動帶上。很多人在這一步翻車的原因是直接把整個src目錄拉進(jìn)工程結(jié)果json_reader.cpp里引用了json_batchallocator.h而 VC6 的預(yù)處理器對當(dāng)前文件所在目錄的搜索順序和現(xiàn)代 IDE 不一樣經(jīng)常報“無法打開包含文件”的錯誤。解決辦法是把include目錄在“工具 - 選項(xiàng) - 目錄 - Include files”里加到最前面同時把src/lib_json目錄也加進(jìn)包含路徑這樣三個 cpp 文件無論放在工程的哪個子目錄都能正確找到頭文件。// 在工程設(shè)置里添加包含路徑后頭文件這樣引用即可 #include json/json.h #include iostream #include fstream這段代碼的頭文件引用方式?jīng)Q定了你的工程目錄結(jié)構(gòu)json/json.h意味著你的包含路徑必須指向include目錄這樣編譯器會去include/json/下找json.h。我見過有人把json.h直接拷到工程根目錄再改成#include json.h也能編過但后續(xù)升級源碼包時容易漏掉其他頭文件不建議這么干。如果用的是源碼包里的json/json.h那json/value.h、json/reader.h、json/writer.h、json/features.h這些也會被自動遞歸包含不需要手動逐個添加。2.2 編譯選項(xiàng)的四個關(guān)鍵點(diǎn)C 語言標(biāo)準(zhǔn)、warning 級別和預(yù)處理指令VC6.0 對 C 標(biāo)準(zhǔn)的支持停留在 1998 年之前的水準(zhǔn)比 C98 還要老。jsoncpp 官方源碼為了兼容舊編譯器在json/config.h里做了一些預(yù)處理判斷但 VC6 的_MSC_VER值對應(yīng)的是 1200新版 jsoncpp 的某些分支沒有覆蓋到這個老版本所以需要在工程里強(qiáng)制定義兩個宏來解決。// 在工程設(shè)置 - C/C - Preprocessor definitions 里添加 // _WIN32 // _MSC_VER1200 // JSON_NO_INT64 (如果不需要 64 位整數(shù)解析)第一個宏_WIN32是確認(rèn) Windows 平臺jsoncpp 內(nèi)部有一些平臺相關(guān)的分支沒有這個宏會走 Linux 分支導(dǎo)致std::string的迭代器類型不匹配。_MSC_VER1200是讓編譯器報告自己的版本號jsoncpp 的config.h里有針對_MSC_VER的#if _MSC_VER 1400之類的判斷會啟用一些舊代碼路徑比如禁用long long的格式化輸出。JSON_NO_INT64是可選宏老工程不需要解析超過 32 位整數(shù)的 JSON 時建議加上防止Json::Value內(nèi)部使用json_int_t類型在 VC6 下出現(xiàn)__int64與long long混用問題。Warning 級別我建議設(shè)置在Level 1也就是只顯示嚴(yán)重警告。jsoncpp 的源碼本身能通過 Level 1 編譯但如果有第三方庫一起編譯Level 4 的警告可能刷屏。最煩人的是 VC6 對某些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)掉也就是不要勾選“禁用語言擴(kuò)展”。2.3 編譯成靜態(tài)庫還是直接用源碼兩種方式的效率對比在 VC6.0 里使用 jsoncpp 有兩種姿勢把三個 cpp 文件直接加進(jìn)自己的工程一起編譯或者先編譯一個json_lib.lib靜態(tài)庫再用。直接加源碼的方式最簡單但每次編譯整個工程都要重新編譯 jsoncpp 的三個文件工程稍微大一點(diǎn)就浪費(fèi)時間。編靜態(tài)庫的方式一勞永逸但初次配置稍微繁瑣。靜態(tài)庫工程的配置要點(diǎn)新建一個 Win32 Static Library 工程把三個 cpp 文件加進(jìn)去編譯選項(xiàng)和 2.2 節(jié)完全一致然后編譯生成.lib文件。在使用端工程的“鏈接器 - 輸入 - 附加依賴項(xiàng)”里填入這個 lib 的名字和路徑。需要注意VC6 的靜態(tài)庫有單線程版和多線程版之分如果你的使用端工程用的是 Debug Multithreaded那靜態(tài)庫也必須用相同的運(yùn)行時庫選項(xiàng)編譯否則鏈接時會報LNK2005或LNK4098這種符號沖突錯誤。# 鏈接器報錯示例LNK2005 _malloc already defined in LIBCMT.lib # 原因靜態(tài)庫用單線程 CRT(/ML) 編譯而使用端用多線程 CRT(/MT) # 解決在靜態(tài)庫工程設(shè)置里把 Runtime library 改成和使用端一致的選項(xiàng)我一般習(xí)慣直接編靜態(tài)庫特別是在維護(hù)多個老項(xiàng)目的時候一份編譯好的 lib 可以給三四個工程共用。但如果你是第一次調(diào)通 jsoncpp我建議先用直接加源碼的方式跑通代碼邏輯等確認(rèn)沒問題再抽成靜態(tài)庫否則一次出現(xiàn)環(huán)境問題和代碼問題疊加在一起排錯會非常痛苦。3. 基礎(chǔ)解析案例從單層對象到嵌套數(shù)組的實(shí)際用法3.1 讀一個簡單 JSON 對象parse 的三種方式與返回值處理jsoncpp 的Reader類提供三種 parse 重載形式接收 C 字符串、接收std::string、接收std::istream。在 VC6.0 里std::istream重載形式用得最多因?yàn)樵O(shè)備接口經(jīng)常把 JSON 數(shù)據(jù)放在文件流或串口數(shù)據(jù)流里。無論哪種重載第一個參數(shù)是 JSON 數(shù)據(jù)源第二個參數(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 拿到具體錯誤信息 std::string errMsg reader.getFormatedErrorMessages(); std::cerr Parse error: errMsg std::endl; } fin.close(); return success; }這段代碼演示了標(biāo)準(zhǔn)的三步流程打開文件流、調(diào)用 parse、失敗時取錯誤信息。第三個參數(shù)false表示不收集所有錯誤信息只保留第一條錯誤這樣出錯時能快速定位。getFormatedErrorMessages()在解析失敗時返回包含行列號的錯誤描述這個信息在調(diào)試設(shè)備返回的半截 JSON 數(shù)據(jù)時特別實(shí)用能直接告訴你 JSON 在哪一行哪個位置斷了。有一個容易被忽略的點(diǎn)parse 成功后Json::Value對象里的數(shù)據(jù)如果不及時提取會隨root的生命周期失效。所以解析函數(shù)盡量不要把Json::Value以值方式返回而是用引用參數(shù)傳入或者用智能指針管理。VC6 沒有std::shared_ptr一般用auto_ptr或者直接傳引用的方式我習(xí)慣傳引用代碼更直白也不會在對象拷貝時觸發(fā) jsoncpp 內(nèi)部引用計(jì)數(shù)的隱患。3.2 取字段值的類型判斷isValidMember 與 type 檢查配合設(shè)備返回的 JSON 字段經(jīng)常缺失或者類型不對有些人直接root[temperature].asDouble()取完之后才發(fā)現(xiàn)數(shù)據(jù)是字符串類型的23.5asDouble 返回 0排查半天。jsoncpp 的Value::isMember()方法只判斷字段是否存在不判斷類型對不對。更穩(wěn)妥的寫法是先判斷類型再決定怎么取值。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()返回一個枚舉值Json::intValue為 0、uintValue為 1、realValue為 2、stringValue為 3 等等把這些值打印出來排查非常直觀。另外注意field.isInt()在 VC6 下對 32 位整數(shù)有效如果你開啟了JSON_NO_INT64宏那isInt64()方法根本不存在不要去調(diào)用否則編譯直接報錯。3.3 解析嵌套數(shù)組數(shù)組遍歷與對象數(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 靈活容易在賦值時多一次拷貝所以直接用索引遍歷更省心。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 提供的一個很有價值的方法第二個參數(shù)是默認(rèn)值字段不存在時直接返回默認(rèn)值不需要像 3.2 節(jié)那樣先isMember再取。但默認(rèn)值只保證字段缺失時不崩字段存在但類型不對時get返回的Value還是錯的值所以對可靠性要求高的字段建議先用isMember檢查。數(shù)組遍歷的邊界條件值得注意sensors.size()返回Json::ArrayIndex類型在 VC6 下是unsigned int和int比較時注意符號問題我寫int n sensors.size()時編譯器會提示符號轉(zhuǎn)換警告直接強(qiáng)轉(zhuǎn)即可。4. 生成 JSON 數(shù)據(jù)對象構(gòu)造、寫入文件與格式化控制4.1 用 Value 對象構(gòu)造嵌套結(jié)構(gòu)Value 的鏈?zhǔn)劫x值原理構(gòu)造 JSON 輸出比解析要友善得多。jsoncpp 的Json::Value重載了operator[]對不存在的字段名會自動創(chuàng)建對應(yīng)類型的 Value 對象所以可以一層一層地往里塞數(shù)據(jù)。核心邏輯是先創(chuàng)建Value對象然后用[key]的方式賦值數(shù)組用append方法添加元素。Json::Value buildStatusReport() { Json::Value root; root[device_id] DEV-2024-001; root[status] online; root[uptime] 3600; // 嵌套對象直接鏈?zhǔn)皆L問子節(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看起來像簡單嵌套實(shí)際上內(nèi)部執(zhí)行了兩個步驟第一步root[network]創(chuàng)建一個空的 Value 對象并返回引用第二步在這個引用上再取[ip]并賦值。這種寫法的潛在風(fēng)險是如果你拼錯了中間層鍵名不會報錯而是自動創(chuàng)建一個新的空對象最終生成的 JSON 里會出現(xiàn)多余的層級。所以寫完構(gòu)造代碼后最好跑一遍流程把生成的 JSON 打印出來人工確認(rèn)結(jié)構(gòu)。4.2 縮進(jìn)與換行設(shè)置StyledWriter 還是 FastWriterjsoncpp 提供兩個 Writer 類FastWriter輸出緊湊格式不帶多余空格和換行StyledWriter輸出帶縮進(jìn)的格式化文本便于人讀。設(shè)備對接時我一般用FastWriter因?yàn)槭×髁慷液芏嗲度胧皆O(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); }兩個 Writer 的write方法都返回std::string而且是拷貝返回不是引用所以函數(shù)返回值直接賦給外部字符串沒問題。有一個隱蔽坑FastWriter默認(rèn)會在輸出末尾加一個換行符\n這是為了讓輸出適合寫入文件。如果你要把 JSON 拼進(jìn)網(wǎng)絡(luò)協(xié)議幀里需要手動pop_back()或者用字符串裁剪去掉末尾換行。同理StyledWriter輸出末尾也有換行但它的末尾換行是縮進(jìn)格式的一部分保留比較合理。4.3 中文內(nèi)容的輸出編碼統(tǒng)一std::string 與 UTF-8 的約定這是 jsoncpp 在 VC6.0 場景下最容易出問題的章節(jié)。jsoncpp 內(nèi)部的所有字符串處理都按 UTF-8 字節(jié)流理解它不會做編碼轉(zhuǎn)換。你的程序里如果直接寫中文字符串字面量比如value[name] 溫度傳感器那這個字符串在 VC6 的源碼里是按本地代碼頁中文系統(tǒng)下是 GBK存儲的字節(jié)序列jsoncpp 會把它原樣寫入 JSON 字符串值里不做任何轉(zhuǎn)譯。把這個 JSON 輸出到任何一個按 UTF-8 解析的設(shè)備或網(wǎng)頁時中文就亂碼了。// 錯誤示范直接賦值中文字面量 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)過這個轉(zhuǎn)換函數(shù)所有從 JSON 里讀出來的中文字符串如果要顯示到 Windows 窗口也要反向轉(zhuǎn)成 GBK。5. 解析中文內(nèi)容實(shí)例GBK 與 UTF-8 的字節(jié)層面換算5.1 中文亂碼的根本原因源碼編碼、執(zhí)行編碼與 JSON 編碼的三方不一致解決中文亂碼的關(guān)鍵不在于 jsoncpp而在于把三個環(huán)節(jié)的編碼理順。第一個環(huán)節(jié)是 VC6 源碼文件里的字符串字面量編碼中文 Windows 系統(tǒng)上默認(rèn)是 GBK第二個環(huán)節(jié)是程序運(yùn)行時字符串在內(nèi)存里的編碼字面量是什么字節(jié)存進(jìn)去就是什么字節(jié)第三個環(huán)節(jié)是 jsoncpp 解析和生成的 JSON 數(shù)據(jù)要求是 UTF-8。這三個環(huán)節(jié)只要有兩個不一致就會出現(xiàn)亂碼。我遇到過的典型場景是設(shè)備端上報的 JSON 數(shù)據(jù)是 UTF-8 編碼的設(shè)備名稱:溫度計(jì)解析到Value對象里是正常的 UTF-8 字節(jié)然后用 StyledWriter 打印到屏幕上調(diào)試控制臺按 GBK 顯示亂碼。這不是 jsoncpp 的問題是調(diào)試輸出環(huán)節(jié)的編碼沒轉(zhuǎn)換。反過來程序里硬編碼的中文寫入 JSON 再發(fā)給設(shè)備設(shè)備按 UTF-8 解碼同樣亂碼。所以整個數(shù)據(jù)處理鏈路里任何涉及外部接口的字符串都必須明確標(biāo)注是 UTF-8 還是 GBK。5.2 源頭修復(fù)用 UTF-8 編碼保存源文件直接從編譯期統(tǒng)一一個能根治部分問題的土辦法在 VC6 里把包含中文字面量的源文件保存成 UTF-8 with BOM 編碼。VC6 的編譯器對 UTF-8 with BOM 的源代碼文件會把字符串字面量按 UTF-8 字節(jié)存入目標(biāo)文件也就是說運(yùn)行時內(nèi)存里的字節(jié)已經(jīng)和 JSON 要求的 UTF-8 一致了。這樣代碼里直接寫value[name] 溫度傳感器也不會亂碼。但這個做法有三個副作用需要注意。第一VC6 的編輯器對 UTF-8 with BOM 的支持不完整打開文件時可能亂碼顯示但不影響編譯結(jié)果。第二如果代碼里同時有 GBK 編碼的源文件和 UTF-8 編碼的源文件字符串拼接時會出現(xiàn)半個中文的奇怪字節(jié)排查很困難。第三資源包里自帶的示例代碼有些是 GBK 編碼保存的你如果混用需要在工程設(shè)置里區(qū)分不能一刀切。// 用 UTF-8 with BOM 保存源文件后字面量本身已是 UTF-8 // 可以直接賦值不需要運(yùn)行時轉(zhuǎn)換 value[device_name] 溫度傳感器; // 但控制臺輸出仍需轉(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 源文件方案時控制臺輸出前需要做utf8ToGbk轉(zhuǎn)換否則調(diào)試窗口還是亂碼。這個方案的好處是省掉了寫入 JSON 前的轉(zhuǎn)換步驟缺點(diǎn)是所有的調(diào)試輸出都要帶轉(zhuǎn)換沒有哪種方案是絕對省事的關(guān)鍵是統(tǒng)一。5.3 運(yùn)行時動態(tài)轉(zhuǎn)換的完整案例解析設(shè)備上報的 UTF-8 中文 JSON大多數(shù)智能設(shè)備的 JSON 都是 UTF-8 編碼所以解析端需要把 UTF-8 轉(zhuǎn)成 GBK 才能正常顯示或?qū)懭氡镜財(cái)?shù)據(jù)庫。下面這個函數(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()); }這三個函數(shù)形成了完整的轉(zhuǎn)換鏈路UTF-8 字節(jié)先轉(zhuǎn)成 UTF-16 寬字符再由寬字符轉(zhuǎn)成系統(tǒng) ANSI 編碼即 GBK。MultiByteToWideChar和WideCharToMultiByte是 Windows APIVC6 完全支持不需要額外鏈接庫kernel32 默認(rèn)已導(dǎo)入。每次轉(zhuǎn)換都要先調(diào)用一次函數(shù)拿緩沖區(qū)長度再分配內(nèi)存做第二次調(diào)用這是 Windows 編碼轉(zhuǎn)換的標(biāo)準(zhǔn)套路。注意返回值里的-1表示輸入字符串以 null 結(jié)尾函數(shù)會處理結(jié)尾字符你不需要手動截?cái)唷?. 避坑實(shí)測記錄VC6 jsoncpp 的編譯期與運(yùn)行期暗礁6.1 鏈接錯誤 LNK2005CRT 庫版本沖突現(xiàn)象工程編譯通過鏈接時報LNK2005 _malloc already defined in LIBCMT.lib有時還會伴隨LNK4098警告。原因jsoncpp 編譯成靜態(tài)庫時用的運(yùn)行庫選項(xiàng)和使用端工程不一致。VC6 的 C 運(yùn)行時庫有單線程/ML、多線程/MT、多線程調(diào)試/MTd、動態(tài)鏈接/MD等模式靜態(tài)庫如果用了 /ML符號定義在 LIBCMT.lib 和 LIBCD.lib 里各有一份鏈接時就會沖突。解決在 jsoncpp 靜態(tài)庫工程和使用端工程里把Project - Settings - C/C - Code Generation - Use run-time library改成完全相同的選項(xiàng)。我一般統(tǒng)一用Debug Multithreaded做調(diào)試版Release Multithreaded做發(fā)布版。改完重新編譯兩個工程問題消失。6.2 解析返回 false 且錯誤信息指向第一行BOM 頭作怪現(xiàn)象用reader.parse解析從文件讀入的 JSON 時返回falsegetFormatedErrorMessages報line 1, column 1附近有非法字符但用文本編輯器查看 JSON 文件完全正常。原因JSON 文件被 Windows 記事本或其他編輯器保存成了帶 UTF-8 BOM 的格式文件頭部多出 3 個字節(jié)EF BB BFjsoncpp 解析器不認(rèn) BOM把它當(dāng)成非法字符。解決解析前對文件流做 BOM 檢測和剝離。讀文件后檢查前三個字節(jié)是否是0xEF 0xBB 0xBF是則跳過。或者用std::ifstream打開文件后先fin std::ws不能跳過 BOM BOM 不是空白符需要手動處理。資源包里的讀文件函數(shù)已經(jīng)內(nèi)置了 BOM 剝離邏輯但如果你自己寫解析函數(shù)記得加上。6.3 解析大文件時程序崩潰遞歸深度與內(nèi)存分配現(xiàn)象解析一個幾十層嵌套的 JSON 文件或者數(shù)組長度超過幾千時程序直接崩潰沒有異常信息。原因jsoncpp 在舊版本里解析嵌套層級過深的對象時遞歸調(diào)用會導(dǎo)致棧溢出數(shù)組過大時append操作頻繁重新分配內(nèi)存VC6 的默認(rèn)堆管理器效率低而且容易產(chǎn)生內(nèi)存碎片。jsoncpp 對解析深度沒有硬限制但運(yùn)行時棧只有 1MB。解決一是限制 JSON 的嵌套層級設(shè)備協(xié)議里明確約定不超過 10 層二是解析前用Json::Reader::getFeatures()里的strictRoot選項(xiàng)把根節(jié)點(diǎn)必須是對象或數(shù)組這一約束打開防止根節(jié)點(diǎn)是數(shù)字或字符串這種非法 JSON 被解析三是如果 JSON 體量很大改用Json::CharReader新版接口配合std::istream流式解析不要一次把整個文件讀入內(nèi)存。6.4 中文轉(zhuǎn)出來的 JSON 在設(shè)備端顯示成 UTF-8 亂碼現(xiàn)象本機(jī)解析和生成 JSON 一切正常但把 JSON 發(fā)到設(shè)備或上傳到 Web 服務(wù)端后中文變成一堆亂碼而且不是\uXXXX形式。原因數(shù)據(jù)在電腦和服務(wù)端之間傳輸時代碼用的是 GBK 字節(jié)串但沒聲明編碼服務(wù)端默認(rèn)按 UTF-8 解碼或者反過來。jsoncpp 在生成 JSON 時不會做轉(zhuǎn)義中文字符如果以原始 UTF-8 字節(jié)寫入字符串值傳輸層再用 GBK 讀就亂碼。解決在 HTTP 或 TCP 協(xié)議頭里明確charsetutf-8并確保發(fā)送前字符串是 UTF-8 字節(jié)。排查時用一個十六進(jìn)制查看器看字符串的第一個字節(jié)0xE4開頭是 UTF-8中文通常以 E4-E9 開頭0xC4或0xD6開頭是 GBK。資源包里的案例工程自帶這個排查工具函數(shù)打印每個中文字符的十六進(jìn)制值。6.5 用 StyledWriter 輸出后字符串被截?cái)嗷騼?nèi)容偏移現(xiàn)象StyledWriter寫出的 JSON 字符串復(fù)制到別的編輯器里偶爾出現(xiàn)內(nèi)容偏移字符串值的末尾少了一個字符或者轉(zhuǎn)義符號被吞掉。原因VC6 的std::string和 C 字符串 API 混用。StyledWriter::write返回的std::string在寫入文件時用了fwrite(str.c_str(), 1, str.length(), fp)但 c_str() 返回的指針可能在后續(xù)字符串對象析構(gòu)時失效如果你先保存了指針再用就等于野指針。解決凡是 Writer 的輸出一律立即用std::string的值拷貝到自己的變量里不要長期持有const char*。寫入文件的長度用str.length()而不是strlen(str.c_str())因?yàn)?JSON 字符串內(nèi)可能包含\0轉(zhuǎn)義序列的存儲形式strlen會提前截?cái)?。這些細(xì)節(jié)在 VC6 的老標(biāo)準(zhǔn)下特別容易踩現(xiàn)代 C 里 std::string 的優(yōu)化策略反而讓這些問題不容易暴露。7. 最后的技巧把中文轉(zhuǎn)換封裝成工程級的全局工具收尾要落地一個能直接抄走的東西。資源包里已經(jīng)附帶了一個獨(dú)立的工具模塊叫encoding_util.cpp把 5.3 節(jié)里的 UTF-8 與 GBK 互轉(zhuǎn)函數(shù)封裝成了CEncodingUtil靜態(tài)類并且加了一個自動識別函數(shù)傳入一個std::string先看字節(jié)特征判斷是否為 UTF-8是則轉(zhuǎn) GBK否則原樣返回。這個函數(shù)在調(diào)試串口設(shè)備數(shù)據(jù)時特別實(shí)用因?yàn)橛行┰O(shè)備的固件版本不同輸出的 JSON 編碼不統(tǒng)一用自動識別可以少寫很多分支判斷。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 范圍直接跳過 } 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; }這個自動識別函數(shù)不算百分之百準(zhǔn)確但對于常見的中文場景足夠。UTF-8 的多字節(jié)序列有嚴(yán)格的比特位模式GBK 的編碼空間和它有部分重疊極少數(shù)情況下會有誤判但概率極低。把這個函數(shù)放在公共模塊里所有項(xiàng)目共用一份比每個 cpp 文件里各寫各的轉(zhuǎn)換函數(shù)要靠譜得多。驗(yàn)證轉(zhuǎn)換是否正確的方法也很簡單調(diào)用Json::StyledWriter把生成的 JSON 打印出來在 VC6 的 Output 窗口里如果中文顯示正常說明內(nèi)存中的字節(jié)已經(jīng)是 GBK如果在 Output 窗口亂碼但文件內(nèi)容正常說明是 UTF-8。也可以用資源里帶的一個小工具函數(shù)PrintHex把字符串每個字節(jié)的十六進(jìn)制打出來對照 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ù)再動業(yè)務(wù)代碼這么多年再沒因?yàn)閬y碼翻過車。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日韩色| 国产成人主播| 色色九区| 色综合一本| 在线免费观看日韩一区| 色欧美在线| 手机在线观看不卡无码av| 一本色道久久综合精品婷婷| 日本新免费二区三区| 一区二区影视| 在线毛片片免费观看| 97超碰人人模人人拍人人| 日韩免费在线观看不卡| 日本国产高清色www视频在线| 欧美午夜一区二区三区| www.激情| 天天射日日干| 丁香婷婷五月| 国内精品伊人久久久久影院会| 大香樵伊人网| 久久东京热成人| 性爱av网站| 久久久久性熟视频| 久久超碰亚洲人| 色天使亚洲综合在线观看| 亚洲性少妇| 亚洲中文字幕妇伦久久| 男女打扑克高清网站| 亚洲无码色| 99久久九九| 9久9久| 亚洲日韩乱码中文无码蜜桃臀网站| 亚洲欧洲日韩天堂av| 超碰97人人cao| 精品久久久av| 亚洲色图在线视频| 六六久久日韩不卡| 99在线免费视频| 欧美爱爱97| 大香蕉99re| 97在线欧洲| 日韩无码成人电影| 亚洲第一成人影院色播| 91日本在线观看| av在线免费一区二区| 成人五月天丁香激情综合| 四虎884| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 亚洲 国产 精品一区| 97久久久| A 天堂| 操逼天美3区| 91肉丝| 成人性爱AV在线免费观看| 日亚韩精品视频二区三| 亚洲有码 视频一区| 久久久久久久久久久久久久久乱码| 69人妻精品一区二区绯色| 97综合国产精品高潮久久| 日产123区精品免费观看| 夜夜黄| 午夜亚洲WWW湿好大| 牛黄色久午久| 日韩无码久久熟女一级片| 亚洲欧洲激情卡通另类文学四射小说网站| 欧美日韩色综合网| 97自拍一区| 日韩猛交| 伊人久久婷婷| 欧美一级二级三级| AV电影在线播放| 久草精品一区| 日韩中文字幕人妻视频| av情色影音| 亚洲97综| 蜜臀久久99精品久久久久久久久| 久久久网一区| 亚洲欧洲精品视频发布| 日韩丨制服丨中文|在线| 中文字幕人妻资源在线| 97人妻碰碰中文无码久热丝袜| 97超级久久强资源| 秋霞一级鲁丝片A片| 粉嫩国产精品久久粉嫩| 国产亚洲99久久精品熟| 日韩AV一区二区三区三州三州| 男人的天堂视频精品乱在线| av天堂影视中文在字幕在线中文| 99re视频在线播放青草| 亚洲18禁| 日本三级A片网站com| 成人夜夜| 欧美一区二区三区另类精品| 欧美熟女逼久久久久久| 天天日天天插| 亚洲精品国产熟女久久久久久| 久久久∴| 亚洲天天艹| 欧美一级美片在线观看免费| 久久婷婷一区| 亚洲淫色网中文| 神马久久午夜| 97色爱| 丝袜熟女一区二区三区| 啪啪视频免费在线观看| 玖玖大干人妻| 天天干人妻| 老司机免费视频在线91| 亚欧成人一级片在线播放| 2010男人的天堂| 91熟女.com| 国产精品白丝www| 日本欧美成人片AAAA| 夜夜操2028| 97超碰免费人人性爱| 蜜臀va69| 日韩激情中文字幕有码| 亚洲熟妇极品| 无码九九九九| 国产中文大片资源中文字幕| 校园春色综合| 五十路三区在线| 欧美黑人精品一区二区| 99抽插| 九月伊人中文字幕| 五月丁香婷婷色| 天美麻豆黄色录像| 乱伦1色页| 嗯嗯啊好大| 国产无码三级视频在线观看| 天堂种子在线www网资源| 熟妇艹鸡八| 家庭乱伦性爱av| 97超碰色屌| 亚洲影院365| 天天欧美色| 91色香| 99re久久| 久久啊啊啊| 国产精品麻豆成人AV艾秋| 亚洲中文字幕av | 久久国模av| 国内毛片热久久思思热| 日韩三A大片在线观看| 97色97好| 久操精品网| 伊人九九九| 狠久久| 中文字幕在线观| 熟女丰满人妻一区| 夜夜影视四色| 麻豆视频一区二区| 亚洲天堂一区| 亚洲全色网| 91老熟女91老女人| 在线黄色污污网站| 人妻密肉在线观看| 中文字幕视频二区| 欧洲欧美视频一区二区| 久久久工口| 亚洲一区二区三区在线激情| 美女丝袜激情小说| 亚洲丝袜天堂| 亚洲人妻av| 97精品国产| 成人精品水蜜桃久久久久久久| 日韩啪啪啪啪啪| 亚洲日韩久久精品一区| 欧美性猛交美女自慰91| 欧美日韩第一页| 欧美传媒| 欧美呦呦性爱| 国产毛片在线| 搡老人老9丨女老熟人| 好爽视频在线观看视频 | 一区二区你上我| 亚洲成人无码影院| 又黄又爽在线观看视频| 亚洲激情av| 激情久久久| 美女主播色欲91抠b在线播放| 欧美精品第3页| 99热精品在线| 天天看天天综合成人网| 国产天天骚| 欧美日韩国第一区| 老熟妇一区二区三区啪啪| 18岁禁 茉莉成人久久| 香蕉99秘 精品一区丁香| 天天射影院| 不卡九肏| 97日韩欧美亚洲| 久热久操| 欧美亚洲首页| 黄色人人| 日韩乱插| 人人操AV| 天美传媒av在线| 国产大片精久久久久久| 久久熟女嫩草成人片免费| 四虎884| 亚洲精品自拍| 五月天婷婷色| 9美女超碰在线免费观看| 天天爽夜夜爽夜夜爽精| 欧美九九爱| 欧美欧美少妇| 国产女性无套 免费观看| 久久欧美按摩999| 久草毛片| 91精品伊人久久久大香线蕉91| 夜夜爽77777| 天天日天天看| 911av网站免费观看| 大香蕉九九| 九九成人精品| 免费精品国偷自产在线在线 | 成人性爱美曰韩| 男人 天堂 日 亚洲| 美女被啪到深处抽搐视频| 激情综合久久| 日逼97| 婷婷九月| 亚洲无码超碰免费| 视频在线中文字幕| 九九热精品| 蜜桃狠狠色伊人亚洲综合网站| 天天操av懂色| 黄色av网站在线播放| 狠肏骚人妻| 老鸭窝亚洲毛片| A一级色女| 国产树林里野战在线看| 这里都是精品| 国产精品久久久视频| 麻豆成人影音在线| 色盈盈影院| 亚洲网站一区二区在线| 东京热熟女亚洲视频网站| 午夜寂寞欧美| 中文字幕97| 久久精品72| 青青免费在线视频一区| 久久熟女久| 国产精选三级在线观看| 中出欧美| 97亚洲在线| 熟妇高潮一区二| 九热超碰| 丰满少妇一区二区三区专区| 久久婷婷亚洲| 色久桃花影院在线观看| 啊啊啊啊好多水| 国产精品色约约| 久久蜜桃综合网| 志村玲子视频一区二区| 天天天天操| 国产69精品久久久久99尤物| 久久性爱视频99| 国产视频第二页| 97超碰中文字幕| 亚洲成成熟女人综合一区二区| 动漫片子网站3黄| 亚洲乱熟女一区二区三区大香蕉| 影音先锋视频在线| 无遮挡一级毛片视频免费的| 麻豆久久精品亚洲精品88| 亚洲无吗在线视频| 欧美国产精品久久九九| 欧美极品美女aaaaaa级黄片| 九九亚洲| 97超碰美女| 在线啊啊啊| 鸥美极品| 天天舔天天日天天射| 亚洲欧美九九| 舔舔啊| 91精品少妇搡搡搡| 亚洲人综合19| 国产精品嫩草影院午夜两性| 亚一综合久久久久久久久久| 丁香五月久久| 色综合加勒比四四季| 97在线观看免费视频l| 欲女人妻性色av| 国产精品无码AV网站| 色噜噜人妻丝袜a∨先锋影| 天堂8在线新版官网| 国产欧美一区激情交| 久久99精品视频| 天天综合,91综合永久| av天堂影视中文在字幕在线中文 | 国产传媒美日韩av| 有码专区最新中文字幕有码| a男人的天堂久久一级A毛片| 日韩欧美国产高清视频| 91精品丝袜久久久久久| 熟妇人妻丰满久久久久久久无码| 97在线视频免费观看| av中亚| 日本国产高清色www视频在线| 97色色婷婷| 日本伦理一区二区| 亚洲欧美精品福利在线| 91精品综合久久久久久五月丁香| 超碰精品| 亚洲中文字幕在线视频一区二区| 亚洲天堂电影精品一区| 久久丝袜| 亚洲天天艹| 9丨久久九九九| 亚洲免费看片| 欧美日韩另类激情图片| 五月天色综合| 91无遮挡| yirendaxiangjiashipin| 欧美日韩制服| 丁香久久| 日本操逼无码| 国产综合久久久鬼色| 91老司机在线| 偷窥自拍亚洲色图| 99激情| 超碰1997| 亚洲AV秘 精品久久老牛影视| 久久久久久性爱片| 亚洲在线网站| 另类av天堂| 日韩欧美午夜一区二区| 亚洲91大片| 午夜黄色免费在线观看| 加勒比综合88| 在线视频五十市| 人妻一二三区| 亚洲综合 欧美| 欧美中出1| 亚洲 在线| 丰满少妇一区二区三区专区| 夜夜天天噜狠狠爱2021| dy888午夜老子影视达达兔| 日韩中文字幕av在线播放| 黑人操一区二区| 黑白配性爱AV成| 亚州男人天堂| 九七毛片九九毛片| 97视频在线观看播放与子乱对白在线……| 中文字幕,人妻,日韩| 亚洲成人在线乱码色午夜| 殴美日韩m| 天堂蜜桃无码视频一区二区| 女人爽到高潮潮喷18禁网站| 最新岛国大片| 国产成人精品必看| 探花视频免费观看国产专区| 97在线视频观看免费| 亚洲国产剧情少妇激情| 久久久久久亚洲精品不卡人乳| 成人一二| 日韩欧美日韩| 大香蕉人妻久久| 素人无码中文字幕| 欧中日成人免费影视| 97精品久久久久中文字幕| 精品一区二区成人| 欧美日韩香蕉| 深夜国产一区二区三区在线看| 国产精品操| 中文字幕第2页| 久久久久久久久9| 日本熟妇精品九九| 欧美乱妇狂野欧美在线视频| 国产精品欧美激在线| 日日夜夜狠狠| 国模限制级电影| 天天日天天爽| 美国一区二区三区视频| 有码人妻系列| 色婷婷综合久久中文字幕雪峰| 一区二区激情国产熟女 | 秋霞曰韩R级| 色综合色综合网| 久久人妻视频| 91丝袜激情在线| 97精品中文字幕| 无码人妻丰满热妇又大又粗| 久操不卡视频| 国产日韩精品一区二区三区| 加勒比海成人视频网| 成人一区二区三区四区| 蜜桃午夜视频一区二区 | 大香蕉伊人久久| 久久有碼| 国产美女自拍AV| 狠狠操天天干| 九9热伊人| 国产女s强制榨精视频| 日韩成人电影AV| 一道本东京热加勒比一区二区三区| 成功精品影院| 999久久芭蕾| 91在线免费精品视频| 唐山老熟妇露脸啪啪叫| 久久综合精品一区二区三区| 91情色在线| 中文字幕天天天天天| 91色射| AV一区观看| 97内射偷拍| 97色网| www99热| 久久久久久久综合,国产| 人人爱人人乐人人操| 久热这里| 丝袜美腿操av| 999岛国大片| 骚逼一区二区| 精品日韩中文在线| 欧美暴力猛交| 污污汅18禁网站在线永久免费观看 | 欧美九九九| 黄网在线播放| 亚洲在线| 制服丝袜第二页| 久久久无码av精| 伊人网一本| 久碰视频| 色九九九九久| 国产三级片在线观看| 国产精品一区人妻精品阁在线| 欧美综合网A| 天堂蜜桃无码视频一区二区| 国产精品美女视频诱惑| 色五月第四色| 亚洲操逼视频网站| 老熟女网站| 蜜臀av中字字幕网站| 国产乱子伦久久精品综合一区二区三| www鬼畜国产男人的天堂| 无码人妻一区二区三区免费九色| 操美女人妻| 亚乱色| 97视频在线看| 超碰综合97在线| 亚州伊人色综台| 人妻啪| 羞涩视频| 加勒比综合a∨| 成人情色综合网| 水澄无码AV| 蜜臀AV秘一区翔田千里| 激情人妻另类| 欧美日韩淫加| 久热69九色熟妇97| 很很干很很操| 最新AVzaixian| 一牛影视成人片免费| 国产成人在线观看网址| 久久久久久久9999| 午夜视频久久久| 麻豆一区二区三区精品| 天天影视激情欧美| 国产农村妇女一区二区| 人人操AV| 91老熟女逼| 日本免费不卡二区| 丰满欧美少妇| 丝袜综合| 激情五月天校园春色网| 在线五区| 伦理片秋霞免费影院| 色99999| 亚洲av性爱电影| 中文操逼字幕| 欧美十八禁导航成人| 26UUU欧美激情一区二区| 欧美激情另类一区二区| 日韩一性一交一A片俄罗斯| 狼狼色丁香久久婷婷综合五月| 国产精品 久久久精品一牛| 黑人白女精品一区| 婷婷综合网站| 蜜臀AV成人精品蜜臀| 91处女在线视频| 啊啊啊啊嗯嗯在线久久久| 精品人妻一区二区三区日产| 亚洲av综合伊人久久| 国产精品亚洲高清在线| 九九Av| 91网18| 国产一区二区精品久久久不卡蜜臀| 干B网| 成人无码在线超碰网| 美女的肌被草喷水视频| 天天天堂影视日韩亚洲91| 东京热av影院| 久操com| 亚洲午夜免费狠狠干| 日本999精品视频| 素人伊尹大香蕉免费下载视频| 3P丝袜熟女 色综合| 97国产精品| 99热这里只有精品地址 | 精品午夜福利| 蜜乳AV色欲AVAV无码| 男人天堂2030| 2020视频1区2区3区| 一区二区三区四区五区久久久久久| 99精品国产户外露出| 婷婷五月丁香五月| 9Ⅰ超碰| 丁香五月偷拍| 精品视频久久| 色女女女导航| 老熟女乱伦片| 久艹日日日| 黄色性爱网网| 婷婷丁香人妻| 狼天天狼天天大香蕉| 欧美成人精品欧美一级乱黄一区二…| aaa一级黄片| www男人天堂| 99爱精品| 嫩草在线视频| 91熟女视频网| 男人的天堂在线有码| 偷拍偷窥与盗摄视频专区| 男人的天堂色偷偷青青草视频婷婷网| 飘花国产午夜精品不卡| 999久久芭蕾| 国产91美女高潮| 综合激情二| 加勒比性爱成人在线| 五月婷婷色| 亚洲欧美在线观看无码| a啊啊啊啊啊啊啊啊一区二区| 久久精品欧美一区蜜桃| 欧美日本中字另类在线| 国产亚洲精品第一最新| 国产精品久久久午夜夜伦鲁鲁| www.夜夜操| 亚瑟国产精品久久无码| 一区二区三区一亚洲中文字幕、综合区灬| 欧美亚洲日韩人妻在线观看| 影音先锋每日最新资源在线观看| 91成人亚洲色图| 成人夜夜爽| 国产精品视频一区二区三区八戒| 69精品| 97欧美久久久久久久| 人人手机欧洲亚洲国产人妻| 国产区性爱在线视频秋霞豆 | 色婷婷电影| 韩国一级AAA| 婷婷久久五月综合激情| 变态综合色| 亚洲图片欧美另类综合免费视频大大香| 久久久久久性爱片| 久久久久13| 爱我干综合| 欧美色性爱| 日韩熟女操逼| 日本熟女不卡视频| 久久久性| 亚洲一区中文精品| 日本潮催一卡操| 国产精品人妻免费精品| 蜜臀久久99精品久久久久久| 国产精品白丝www| 67914在线兔费成人视频| 97超碰超欧美。| 狠操91,com| 亚洲se电影| 嗯嗯嗯啊啊在线观看| 亚洲色婷婷综合久久一区二区三区| 美女网站黄页| 天天性射网| 亚洲资源站| 亚洲A曰本VA欧美VA视频| 欧美精品一区二区少妇免费A片| 韩国一级婬片A片无码天美| 国产欧美成人第一页在线观看| 国产欧美日韩一区二区三区| 大屁股xxxxx| 国产伦精品一区二区三区视频女| 麻豆天美国美国产| 超碰在线97国产| 偷拍导航视频网站| 国产精品女生av| 天天综合精品| 日本黄页视频在线观看| 久久粉色| 久久av成人无码免费| 1024日韩| 色偷偷综合91久久噜噜| 自拍偷拍第26| 人妻久热在线| 亚洲九九视频| 日本无码1| 另类专区在线观看| 第四色色综合91| av日韩中文字幕| 青青草好吊色| 日韩成人电影AV| 伊人991| 成年无码动漫av片无尽在线 | 亚洲精品人体| 中文字幕91页| 欧美性,亚州色| 素人伊尹大香蕉免费下载视频| 亚洲无线观看久久| 熟女丰满人妻一区| 91视频综合在线| 色欲Av人妻精品一区二| 九九九久千久久激情蜜桃在线看 | 精品国产Av无码久久久亚洲| 精品二区久久| 99精品在线| 91亚洲图片| 五月天激情婷婷| 日日躁夜夜躁狠狠躁超爽| 国产熟女完整版中字| 91高潮喷水美女| 夜夜高潮夜夜爽高清视频一| 操逼A∨| 韩日男人的天堂| 亚洲最新Av| 欧洲与亚洲欧美精品中文字幕| 欧美1区二区三区公司 | 蜜桃色院一区久久| 国产无码一二三区| 久久精品电影在线| 欧美一二三区四五区| 看大黄色大片原件| 精品免费囯产一区二区三区| 青青草在线视频人人想人人上 | 在线A日本| 日日爽熟女| 久久免费中文字幕在线观看| 亚洲高清国产理伦片| 天天综合青苹果| 欧洲中文字幕| 天天操夜夜操狠很操| 69丨亚洲丨精品丨入口免费播放| 欧美人人天天网| 丝袜美腿91| 国产麻豆福利av在线播放| 宅男午夜在线视频| 麻豆av一区二区| 色五月婷婷中文字幕| 蜜臀久久99'精品久久久| 亚洲字幕一区二区| 久久m| 亚洲一区中文精品| 久久久久久久久久久人妻| 中文字幕精品码亚洲| 97干在线| 亚洲性天堂| 婷婷久草一区二区三区| 日日夜夜精品视频| 男人的天堂激情| 国模无码人体一区二区三| 91 国产丝袜在线放观看| 免费A片三p视频| 成人色女网| 亚欧成人综合影院| 久久久久婷婷精品av电影| 性爱av网站| 久久久久久免费电影| 日本女人操逼| 91精品91久久久久77777俄罗斯老妇姓x| www.狠狠| 国产成人精品日本亚洲语言| 日韩图色| 日逼五月天| 亚洲AV无码AV吞精久久久久| 九九九国产精品| 亚洲天堂中文字幕无码男同| 国产乱伦搜索结果91P| 久久97资源 网| 乱欲一区二区| 96一区二区| 欧美变态激情网| 国产精品午夜高潮呻吟久久av| 日本幼女18+| 九九热精品在线| 国产又黄又粗的视频| 日韩精品影视| 日韩另类色图| 无码精品人妻一区二区三区妖精| 亚洲影视高清三级-草1024榴社区入口-品爱AV| 五月丁香啪啪| 操婢日韩| 淫淫综合网| 最新精品久久蜜桃 | 国内毛片无遮挡国产| 亚洲色图第一页| 翘臀vidoes| 欧美性爱三区二区| 超碰在线人人射| 天天综合网合集91| 不卡人妻少妇精品毛片一区23区视频| 99热99在线播放激情| 人妻精品一区二区| 使劲用力艹少妇视频一区二区| 亚洲一区日韩| 日本三级A片网站com| 欧美亚洲手机在线| 视频在线中文字幕| 你草精品在线视频| 天美av在线观看| 日韩性爱小视频在线观看| 超碰精品日韩欧美国产| 蜜臀99久久国产| 麻豆人妻偷人精品无码视频| 九九九久千久久激情蜜桃在线看 | www黄片免费看com| 国产JDAV无码视频在线观看| 91 天天综合| 久欲AV| 亚洲男人的天堂AV| 91大神电影天堂| 五月天婷婷基地| WWW黄片COM| 久热香蕉精品在线视频| 92性色国产午夜福利在线661| 60秒不遮不挡| 日韩欧美麻豆 | 91骚熟女| 九九九九九九九九九国产精品| 欧美第二页午夜| 青青欧洲黑| 另类av天堂| 久久久久久久久久久久久久久乱码 | 日韩性爱高清免费视频| 国产AV久久野战精品| 国产一区二区三三视频| 国产精品成久久久久午夜午夜| 欧色网址| 91性片| 精品999999| 天天日天天干天天操| 精品对白久久不卡| 欧美综合网在线| 亚洲国产精品无石码久久| 九九热av| 欧美翘臀视频网站一区二区三区| 久久爱97| 亚洲精品九九九| 美女诱惑一区| 久久久97| se吧提供91精品国产91久久久久久| 超碰色综合| 婷婷色综合欧美日韩| 亚洲不卡三级手机播放| 亚洲AV麻豆Aⅴ无码电影一| 乱伦熟女专区| 日韩性爱1级片视频| 亚洲熟女性高潮久久久| 亚洲导航深夜福利| 91粉嫩萝控精品福利网站_精品影音先锋国 | www.acm成人黄色毛片| 黄久久| 久久久精品网| 国产精品久久久久久亚洲色欲| 人人做,人人操,人人摸| 综合免费无码中文| 99精品久久| 久久久噜噜噜久久久| 国产熟女| 久久精品无码熟妇一区二区三区视频导航 | 一区二区播放| 97亚洲中文| 成人五级久久| www…国产操逼| 91久久国产综合久久| 日少妇亚洲版| 亚洲久草AV色图| 国产精品操| 在线播放一级无码视频| 国产精品视频精品一二| 欧美黑人猛交春色影视大全| 98精品国产乱码久久久久久| 玖玖无码超碰| 欧美v亚洲v综合v国产v妖精| 天堂中文日本在线观看| 亚洲欧洲偷拍一区| 亚洲视频二区 | 精品美女少妇一区二区| 国产综合日韩伦理| 97国产成人精品免费视频| 一区二区三区 丝袜 高跟 美腿| 色天堂综合| 美女91在线| 日韩亚洲国产视频| 久操黄色视频| 精品综合久久久久久97| 亚洲本色精品一区二区久久| 国产精品无码在线| 极品白嫩福利在线| 久久天堂网| 台湾一区国产高清在线| 日本久久精品| 欧美综合网1| 国产日本一区二区三区蜜臀在线观看| 亚洲成a人片在线观看中文!!!| 91 手机在线播放 绯色| 粉嫩久久久极品| 久久中文字幕一区不卡| 人人天天欧洲| 成人草草视频| 欧美经典一区二区三区| 九九热免费国产视频婷婷伊人五月 | 亚洲不卡不卡中文字幕不卡| 国产丁香精品露脸视频| 欧美日韩不卡a片| 97欧美精品综合| 五十路三区在线| 激情五月天丁香社区| 热久日综合| 国产无码三级视频在线观看| 看日韩美女二区三区免费操逼视频| 老女人91| 国产AV毛片| 麻豆激情综合| 国产传媒午夜理伦精品| yirendaxiangjiashipin| 91制服丝袜中文字幕| 国内毛片无码一级毛片| 豆1无夜无码| 久久国产乱子伦精品免费女人| 亚洲情色1区| 97国产人人| 97超碰jingpin| 69精品| 九九热九九热| 操碰97| 欧美专利1区2区3区4区5区免费| 麻豆精品.欧美精品.日韩精品.| 久久久久国产无av| 欧美激情 亚洲色图| 自偷自拍的亚洲视频| 大色网久久| 久久激情综合| 999色欧美中文字幕| 国产情侣自拍在线播放| 亚洲乱熟女一区二区| 欧亚性爱视频免费看| 久久影视二区三区行押| 激情五月天丁香社区| 国产97色在线 | 亚洲| 婷婷五月天丁香| 久久少妇| 亚洲 欧美 另类 综合 偷拍| AA级电影三区| a片亚洲一本通视频| 蜜乳AV网址| 亚洲欧美综合图片| 久久精品人体AV| 97超碰人人模人人拍人人| 久视频在线观看| 人妻献身系列第54部| 九九九九精品一区| 黄aaaaaaaaaaaaaaaaaa色网站| 精品熟妇视频一区二区| 中文字幕精品一区二区精品| 天天躁日日躁狠狠躁| 日韩国产十八禁| 免费啪啪一级视频| 精品人妻丰满熟妇一区二区三| 熟妇熟女亚洲天堂网| 国产亚洲深夜激情| 九七人妻在线| 看日韩美女二区三区免费操逼视频| 国产成人欧美精品在线| 啊啊啊快操我视频| 女人爽到高潮潮喷18禁网站| 中文字幕一区二区三区50路| 亚洲免费97免费| JIZZJIZZ国产精品喷水| 国产9区| 亚洲天堂日本| 精品视频久久久久九九九九9999| 狠狠久久手机视频精品| 欧美在线视频观看一二三四区高清| 强奸乱亚洲| 澳门黄片一香蕉视频| 天操天操夜操夜月操月年年操操| 亚洲人人操| 日韩无码三级影院| 无人区高清电影免费观看一区二区三 www.qmcai2.com | 91色鬼| 日韩av影片在线观看| 尤物av网站免费在线播放| 欧美人妻另类在线| 蜜桃中文字日产乱幕4区| 午夜欧美女人操逼| 亚洲无码 国产无码| 欧美少妇高潮| 超碰98综合网| 久久精品人体| 在线观看国产黄色| 国产久久成人| 亚洲另类春色| 日1区2区3区2020| 精品人妻视频一区二区三区蜜桃视频| 91久久久久久| 午夜理论片在线观看免费| 蜜臀无码视频在线观看| 久久男人| 亚洲素人综合| 亚洲欧洲第二视频在线观看色图| 男人天堂久久精品| 日韩无码专区| 亚洲欧综合另类无码一区| 日语五十路和六十路亚洲国产精品 | 校园春色 欧美| 99re在线视频这里只有精品| 天天α片| 玖玖爱综合| 98一区二区精品| 熟女乱伦二区| 爱av免费| 操高情无码| 国产精品国产自产高清AV| 青娱乐国产剧情av一区| 亚洲中文字幕一区二区| 加勒比少妇AV婷婷六月天超碰超碰| 亚洲 图片 欧美 色图| 国产后入精品| 日本人体九九九九九九| 91日韩在线| 99精品热| www.久久爱| 91丨九色丨国产打屁股| 日韩成人大片一区二区| 亚洲成?V人片在线观看福利| 成在线人在线观看视频| 亚洲无无码αⅴ每日更新| 妇女性内射冈站HDWWWCOM| 中英熟女操女| 国产偷拍网站| 91精品人妻偷情| 看免费的黄片| 91精品久久久久五月天精品| 老熟女乱伦一区| 免费成人在线观看91| 国产亚洲日韩欧| 欧美91视频| 口爆吞精在线观看| 蜜乳AV一区二区三区四| 一区二区三区精品视频| 亚洲国产无码精品首页久久久| 国产成人精品日本视频| 亚洲福利中文字幕在线| 久久婷婷热| 9/A片 | 人人操人人干xxx| 91久久免费视频互動交流| 免费自拍三级综合| 国产高清MV操逼视频| 综合一区中亚洲国产成人综合精品| 国产精品免费视频不卡| 五月婷婷激情网| 日韩精彩免费| 欧美国产一区二区三区麻豆传媒 | 国产性爱在线视频一区二区| 国产AV久久野战精品| 国产精品亚洲一区二区三区四区| 色5月婷婷| 日本天堂网| 精品人妻一区春色| 啊啊在线| 日韩欧美性吧婷婷乱伦大香蕉 | 91性高| 91天天综合在线| 97亚洲综合影院| 国产精品毛片?v一区二区三区| 日韩av不卡在线观看| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 黄站在线免费观看| 欧美少妇色图| 欧美成人A天堂片在线观看| 亚洲色欲天天人妻无码系列专区| 天无日色综合| 亚洲 综合 第一页| 熟女人妻一区二区三区免费看| 激情 欧美 亚洲 小说| 国产福利精品最新在线| 韩日男人的天堂| 欧美女同在线| 人妻另类 专区 欧美 制服| 日韩在线观看字幕精品| 日韩欧美麻豆大片| 91 国产丝袜在线播放-百度| 亚洲精品99999| 亚欧无码在线| 欧美色图亚洲色图成人在在线| 九一国产精品| 操逼无码操逼| 五月婷婷激情综合| 美女91色黄18| 亚洲性爱成人| 婷婷久久综合| 精品少妇人妻一区二区三区| 久久综合九色综合欧洲98| 中文字幕精品区先锋资源| 天天亚洲综合| 上特色A在线| 成人三级片无码| 欧美老妇女内射网址| 97精品在线视频| 日本欧美亚洲高清在线看| 天天弄欧美| 亚洲欧美黄| 婷婷五月天av| 97精选久久| 亚洲AV成人无码一二三久久 | 亚洲图片欧美| 国产久久久久久久久一区二区| 夜夜狠狠躁日日躁色视频| 草草草草视频| 人人扣人人操| 果冻传媒A片一二三区| 性爱免费视频成人| 日韩av三四区| 老女人综合网| 狠狠操夜夜操蜜桃视频三区| 久久精品无码熟妇一区二区三区视频导航| 最新亚洲人成网站在线影院| 清清一区二区三区四区不卡视频| 国产农村妇女毛片精品久久| 老司机射| 久久是精品| 日美免费黄片| 久久精品中文| 美国一区二区三区视频| 97 国产一区| 囯戸精品高潮呻吟旡码| 麻豆国产av网| 免费人成毛片乱码| 久久久久久大| 超碰97人妻免费在线| 啪啪视频mP4| 国产成人亚洲精品无| 大香蕉碰碰| 亚洲综合第一页| 91人人看| 97无码视频在线播放| 操美女人妻| 国产精品露脸在线观看| 91美女视频在线| 国产成人欧美一区二区三区的国产| 九九九久久久久| 韩国一级AAA| 欧美精品,四区。五区| hd成人一区二区在线| 国产熟码AV| 狠狠色丁香| 天天做天天爱| 91人妻丝袜无码| 亚洲av综合伊人久久| AV99热18这里只有精品| 91在线精品| 九九操久久国产免费视频| 丁香六月综合激情| 亚洲av成人精品一区| 啊啊啊好舒服好爽啊啊啊视频| 久久久久久久伊人精品| 囯产精品强| 五月丁香综合激情| 亚洲天堂男人的天堂| 激情文学欧美| 亚洲精品影视老司机| 校园春色 亚洲| 青娱乐亚洲热| 天天看天天在线精品| 日本免费二区三区| 射 色综合| 国产精品网址| 大逼色网站| 尤物av网站| 男人的天堂一区三区| 91w欧美| 久草在| a久久| 国产一区二区三区视频在线看| 哑洲在线| 天天操女人| 免费A V在线播放| 一区二区三区国产在线播放 | 啊啊啊啊啊啊好多水| 极品后入免费视频| 玖玖色综合| 素人一区二区三区日韩| 综合熟妇一区二区三区| 丰满少妇一区二区三区专区| 99久久婷婷丁香| 日日摸天天爽夜夜欢| 好屌色综合| 中文字幕二区日韩天堂| 夜嗨影院| 搡老女人911熟妇老熟女| 果冻传媒A片一二三区| 打av高清| 男人天堂一区二区| 国产精品一级特黄aaa大片在线观看| 天天天肏屄肏屄肏屄欧美欧美| 黄色人人| 国产AV高清AV无码| 91成人高清在线观看| 日韩97在线| 91九色丰满高潮| 欧美一区二区成人一卡| 97人肏| 亚洲中文字幕av| 91高清无码下载| 国产探花日韩援交| 97超碰超碰| 午夜欧美精品久久久| 国产精品午夜精品| 欧美性生活内射| 精品人妻夜夜草| 男人天堂久久精品| 狠狠色色| 国产精品免费视频人成| 欧美精品一区二区少妇免费A片| 国产精品美女| 人人澡人人干| 91狠狠狠| 亚洲天天精品| 98福利在线视频| 日韩精品99久久久久久中文字幕| oumeisetu综合| 综合网欧美在线| 深夜啪啪啪视频免费| 99热婷婷| 激情五月天色色网| 99精品久久久久久久婷婷蜜桃| 视频在线观看免费一区二区三区 | GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 婷婷丁香五月激情啪啪| 户外裸露刺激视频第一区| 人妻 中文 日韩| 日本一级婬片试看三分钟| 色黄污美女啪啪啪免费网站| 欧美色www亚洲国产阿娇要播| 亚洲精品九九九| 女性91网站| 男女一进一出视频久久| 玖草在线视频| 欧美男人天堂| 精品国模无码| 欧美传媒| 亚洲国产一区二区日韩专区| 美女操逼A A| 在线观看无码三级少妇| 天天操天天干一区二区| 精品国产人成在线| 最近的最新的中文字幕视频| 韩国一级婬片A片AAAAA|