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

ARTICLE DETAIL

資訊詳情

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

零依賴手寫UTF-8編解碼:C語言字符處理實(shí)戰(zhàn)

零依賴手寫UTF-8編解碼:C語言字符處理實(shí)戰(zhàn) 1. 為什么我要在C語言里手搓UTF-8處理函數(shù)很多人第一次接觸字符編碼都是在網(wǎng)頁的meta charsetutf-8這行標(biāo)簽里。寫前端的時(shí)候知道要加這行寫C語言的時(shí)候卻往往忽略了一件事C語言標(biāo)準(zhǔn)庫里的char就是一個(gè)字節(jié)它根本不知道什么叫字符。你從文件里讀出來的一串字節(jié)到底怎么切分、怎么判斷長(zhǎng)度、怎么截?cái)嗳磕阕约禾幚怼N以谧鲆粋€(gè)純C的小工具時(shí)遇到了這個(gè)問題。需求很簡(jiǎn)單讀入一段文本按字符逐個(gè)處理遇到中文、日文、emoji 都要能正確識(shí)別為一個(gè)字符而不是按字節(jié)亂切。第一反應(yīng)當(dāng)然是找第三方庫比如各種成熟的 Unicode 處理庫。但項(xiàng)目有個(gè)硬約束——不能引入任何第三方依賴編譯出來就是一個(gè)干干凈凈的單文件可執(zhí)行程序扔到任何有C編譯器的機(jī)器上都能直接編。這個(gè)約束其實(shí)很常見。嵌入式環(huán)境、教學(xué)作業(yè)、競(jìng)賽題目、還有那些要求零依賴的命令行小工具都會(huì)碰到。于是我就決定自己寫一套 UTF-8 的編解碼和常用工具函數(shù)。做完之后發(fā)現(xiàn)這件事沒有想象中那么難核心邏輯加起來也就兩三百行但里面有幾個(gè)坑如果不提前知道調(diào)試起來會(huì)非常痛苦。這篇文章就把我整個(gè)實(shí)現(xiàn)過程拆開講清楚。適合兩類人看一類是正在學(xué)C語言、想搞明白字符編碼到底怎么回事的朋友另一類是有實(shí)際需求、需要在無第三方庫環(huán)境下處理多字節(jié)文本的開發(fā)者。我會(huì)從UTF-8的編碼原理講起然后給出完整的工具函數(shù)實(shí)現(xiàn)最后重點(diǎn)講我在實(shí)測(cè)中踩到的坑和排查過程。所有代碼都是純標(biāo)準(zhǔn)C不依賴任何平臺(tái)特有的頭文件。2. UTF-8的編碼規(guī)則到底是怎么設(shè)計(jì)的2.1 從ASCII的兼容性說起要理解UTF-8得先明白它要解決什么問題。ASCII用7個(gè)比特表示128個(gè)字符一個(gè)字節(jié)就夠了。但全世界那么多種文字128個(gè)位置遠(yuǎn)遠(yuǎn)不夠。于是有了Unicode給每個(gè)字符分配一個(gè)唯一的碼點(diǎn)code point比如漢字中的碼點(diǎn)是 U4E2Demoji 的碼點(diǎn)是 U1F600。問題來了碼點(diǎn)范圍從 U0000 一直到 U10FFFF跨度很大怎么用字節(jié)序列表示如果統(tǒng)一用4個(gè)字節(jié)那英文文本的體積會(huì)膨脹4倍而且和已有的ASCII系統(tǒng)完全不兼容。UTF-8的設(shè)計(jì)目標(biāo)就是變長(zhǎng)編碼 完全兼容ASCII。具體做法是ASCII范圍內(nèi)的字符U0000 到 U007F仍然用1個(gè)字節(jié)表示最高位是0。這樣任何一段純英文文本用UTF-8編碼和用ASCII編碼出來的字節(jié)完全一樣老程序讀它也不會(huì)出錯(cuò)。超出ASCII范圍的字符用2到4個(gè)字節(jié)表示每個(gè)字節(jié)的最高位都是1通過前導(dǎo)1的個(gè)數(shù)來標(biāo)記這個(gè)字符總共占幾個(gè)字節(jié)。2.2 四種長(zhǎng)度的字節(jié)模板UTF-8的編碼模板可以總結(jié)成一張表這張表是整個(gè)實(shí)現(xiàn)的核心建議直接背下來碼點(diǎn)范圍字節(jié)數(shù)字節(jié)模板U0000 ~ U007F10xxxxxxxU0080 ~ U07FF2110xxxxx 10xxxxxxU0800 ~ UFFFF31110xxxx 10xxxxxx 10xxxxxxU10000 ~ U10FFFF411110xxx 10xxxxxx 10xxxxxx 10xxxxxx看這張表能發(fā)現(xiàn)幾個(gè)規(guī)律。第一首字節(jié)的前導(dǎo)1的個(gè)數(shù)正好等于這個(gè)字符的總字節(jié)數(shù)。1字節(jié)的首字節(jié)是0開頭2字節(jié)是110開頭3字節(jié)是1110開頭4字節(jié)是11110開頭。第二所有后續(xù)字節(jié)也叫續(xù)字節(jié)都是10開頭。這個(gè)設(shè)計(jì)非常巧妙它保證了兩個(gè)重要性質(zhì)任何一個(gè)字節(jié)你都能立刻判斷出它是首字節(jié)還是續(xù)字節(jié)而且從一個(gè)字節(jié)序列的任意位置開始掃描只要找到0或110或1110或11110開頭的字節(jié)就知道這是一個(gè)字符的起點(diǎn)。2.3 為什么這個(gè)設(shè)計(jì)能自同步自同步是UTF-8一個(gè)被低估的優(yōu)點(diǎn)。假設(shè)你的字節(jié)流中間丟了一個(gè)字節(jié)或者從中間某個(gè)位置開始讀你不需要從頭重新解析只要往后找到第一個(gè)不是10開頭的字節(jié)那就是下一個(gè)字符的起點(diǎn)。這個(gè)特性在網(wǎng)絡(luò)傳輸和文件讀取中非常實(shí)用。對(duì)比一下UTF-16它用固定的2字節(jié)或4字節(jié)表示但字節(jié)序大端小端問題、代理對(duì)surrogate pair問題都很麻煩而且和ASCII不兼容。UTF-8犧牲了一點(diǎn)解碼時(shí)的判斷成本換來了兼容性和健壯性這就是它成為互聯(lián)網(wǎng)事實(shí)標(biāo)準(zhǔn)的原因。理解了這張模板表接下來的編碼和解碼就是純粹的位運(yùn)算了。編碼就是把碼點(diǎn)的二進(jìn)制位按模板填進(jìn)去解碼就是反過來把x位置的位取出來拼成碼點(diǎn)。3. 手寫編解碼函數(shù)從碼點(diǎn)到字節(jié)序列3.1 編碼函數(shù)的設(shè)計(jì)思路編碼函數(shù)要做的事情是輸入一個(gè)碼點(diǎn)用uint32_t表示輸出對(duì)應(yīng)的UTF-8字節(jié)序列并返回寫入了幾個(gè)字節(jié)。我給它設(shè)計(jì)的簽名是這樣的int utf8_encode(uint32_t codepoint, unsigned char *out);返回寫入的字節(jié)數(shù)如果碼點(diǎn)非法比如落在代理區(qū) UD800~UDFFF或者超過 U10FFFF返回 -1。out緩沖區(qū)由調(diào)用者保證至少有4個(gè)字節(jié)。實(shí)現(xiàn)的時(shí)候我按碼點(diǎn)范圍分四種情況處理。這里有個(gè)細(xì)節(jié)要注意位運(yùn)算的移位和掩碼必須精確對(duì)應(yīng)模板。以3字節(jié)為例模板是1110xxxx 10xxxxxx 10xxxxxx總共能容納 46616 位正好覆蓋 U0800 到 UFFFF 的范圍。int utf8_encode(uint32_t cp, unsigned char *out) { if (cp 0x7F) { out[0] (unsigned char)cp; return 1; } else if (cp 0x7FF) { out[0] 0xC0 | (cp 6); out[1] 0x80 | (cp 0x3F); return 2; } else if (cp 0xFFFF) { if (cp 0xD800 cp 0xDFFF) return -1; // 代理區(qū)非法 out[0] 0xE0 | (cp 12); out[1] 0x80 | ((cp 6) 0x3F); out[2] 0x80 | (cp 0x3F); return 3; } else if (cp 0x10FFFF) { out[0] 0xF0 | (cp 18); out[1] 0x80 | ((cp 12) 0x3F); out[2] 0x80 | ((cp 6) 0x3F); out[3] 0x80 | (cp 0x3F); return 4; } return -1; }這段代碼里0xC0、0xE0、0xF0分別是2、3、4字節(jié)首字節(jié)的前綴掩碼0x80是續(xù)字節(jié)的前綴。每次取6位 0x3F是因?yàn)槔m(xù)字節(jié)只有6個(gè)可用位。這個(gè)每次6位的規(guī)律是UTF-8位運(yùn)算的核心節(jié)奏。3.2 解碼函數(shù)判斷長(zhǎng)度是第一步解碼比編碼稍微復(fù)雜一點(diǎn)因?yàn)槟阋扰袛喈?dāng)前字節(jié)是首字節(jié)還是續(xù)字節(jié)是首字節(jié)的話還要算出總長(zhǎng)度。我設(shè)計(jì)的簽名是int utf8_decode(const unsigned char *in, uint32_t *codepoint);返回消耗的字節(jié)數(shù)失敗返回 -1。這里有個(gè)關(guān)鍵點(diǎn)函數(shù)不能假設(shè)輸入緩沖區(qū)有多長(zhǎng)所以調(diào)用者必須保證傳入的指針指向一個(gè)完整的字符序列或者函數(shù)內(nèi)部只讀取它判斷出的長(zhǎng)度范圍內(nèi)的字節(jié)。我在實(shí)現(xiàn)里只讀取必要字節(jié)不做越界訪問。int utf8_decode(const unsigned char *in, uint32_t *cp) { unsigned char b0 in[0]; if (b0 0x80) { *cp b0; return 1; } else if ((b0 0xE0) 0xC0) { if ((in[1] 0xC0) ! 0x80) return -1; *cp ((uint32_t)(b0 0x1F) 6) | (uint32_t)(in[1] 0x3F); return 2; } else if ((b0 0xF0) 0xE0) { if ((in[1] 0xC0) ! 0x80 || (in[2] 0xC0) ! 0x80) return -1; *cp ((uint32_t)(b0 0x0F) 12) | ((uint32_t)(in[1] 0x3F) 6) | (uint32_t)(in[2] 0x3F); return 3; } else if ((b0 0xF8) 0xF0) { if ((in[1] 0xC0) ! 0x80 || (in[2] 0xC0) ! 0x80 || (in[3] 0xC0) ! 0x80) return -1; *cp ((uint32_t)(b0 0x07) 18) | ((uint32_t)(in[1] 0x3F) 12) | ((uint32_t)(in[2] 0x3F) 6) | (uint32_t)(in[3] 0x3F); return 4; } return -1; }判斷首字節(jié)類型用的是掩碼比較(b0 0xE0) 0xC0判斷是不是110開頭(b0 0xF0) 0xE0判斷是不是1110開頭(b0 0xF8) 0xF0判斷是不是11110開頭。這個(gè)技巧比逐位檢查更簡(jiǎn)潔也是標(biāo)準(zhǔn)做法。注意解碼時(shí)一定要校驗(yàn)續(xù)字節(jié)的高兩位是不是10。很多簡(jiǎn)化實(shí)現(xiàn)會(huì)跳過這個(gè)檢查結(jié)果遇到損壞的數(shù)據(jù)就會(huì)解出亂七八糟的碼點(diǎn)甚至越界讀取。這個(gè)校驗(yàn)是健壯性的關(guān)鍵。3.3 一個(gè)容易被忽略的細(xì)節(jié)最短編碼校驗(yàn)上面這段解碼代碼有個(gè)漏洞它沒有檢查最短編碼。什么意思比如字符AU0041本來應(yīng)該用1個(gè)字節(jié)0x41表示但理論上你可以用2字節(jié)0xC1 0x81來表示它解碼出來還是 U0041。這種叫過長(zhǎng)編碼overlong encoding是安全漏洞的常見來源。嚴(yán)格來說解碼時(shí)應(yīng)該校驗(yàn)2字節(jié)編碼的碼點(diǎn)必須 ≥ 0x803字節(jié)的必須 ≥ 0x8004字節(jié)的必須 ≥ 0x10000。我在第一版里漏了這個(gè)檢查后來在測(cè)試時(shí)用構(gòu)造的惡意數(shù)據(jù)才發(fā)現(xiàn)。加上校驗(yàn)的代碼是在每個(gè)分支里多一個(gè)判斷// 2字節(jié)分支內(nèi)解碼完成后 if (*cp 0x80) return -1; // 過長(zhǎng)編碼這個(gè)細(xì)節(jié)在實(shí)際項(xiàng)目中很重要尤其是處理來自外部的不可信數(shù)據(jù)時(shí)。雖然多幾行代碼但能避免很多潛在問題。4. 那些真正讓代碼好用的工具函數(shù)光有編解碼還不夠?qū)嶋H用起來你會(huì)發(fā)現(xiàn)最常需要的是一組順手的工具函數(shù)。我把它們分成三類字符計(jì)數(shù)、字符串遍歷、以及緩沖區(qū)安全操作。4.1 計(jì)算字符串的字符數(shù)strlen返回的是字節(jié)數(shù)不是字符數(shù)。對(duì)于一段中文文本字節(jié)數(shù)可能是字符數(shù)的3倍。寫一個(gè)utf8_strlen很直接從頭掃描每次解碼一個(gè)字符計(jì)數(shù)加一指針后移解碼消耗的字節(jié)數(shù)。size_t utf8_strlen(const char *s) { size_t count 0; const unsigned char *p (const unsigned char *)s; while (*p) { uint32_t cp; int len utf8_decode(p, cp); if (len 0) { p; continue; } // 遇到非法字節(jié)跳過 p len; count; } return count; }這里有個(gè)設(shè)計(jì)決策遇到非法字節(jié)怎么辦我選擇跳過1個(gè)字節(jié)繼續(xù)而不是直接返回錯(cuò)誤。原因是實(shí)際文本里偶爾會(huì)有損壞的字節(jié)如果整個(gè)函數(shù)因?yàn)橐粋€(gè)壞字節(jié)就失敗用戶體驗(yàn)很差。跳過并繼續(xù)至少能統(tǒng)計(jì)出大部分正確字符。當(dāng)然如果你需要嚴(yán)格的錯(cuò)誤報(bào)告可以改成返回錯(cuò)誤碼。4.2 按字符截?cái)嘧址@是最實(shí)用的函數(shù)之一。比如你要在界面上顯示一段文本限制最多20個(gè)字符但不想把一個(gè)中文字符從中間切斷那樣會(huì)顯示成亂碼。utf8_truncate就是干這個(gè)的size_t utf8_truncate(const char *s, size_t max_chars, char *out, size_t out_size) { const unsigned char *p (const unsigned char *)s; size_t chars 0, bytes 0; while (*p chars max_chars) { uint32_t cp; int len utf8_decode(p, cp); if (len 0) break; if (bytes len out_size) break; // 留出結(jié)尾的\0 memcpy(out bytes, p, len); bytes len; p len; chars; } out[bytes] \0; return bytes; }注意out_size的判斷用的是而不是因?yàn)橐o結(jié)尾的\0留位置。這個(gè) off-by-one 的坑我踩過第一次寫的時(shí)候用了結(jié)果緩沖區(qū)剛好滿的時(shí)候會(huì)越界寫一個(gè)字節(jié)。4.3 驗(yàn)證一段字節(jié)是不是合法UTF-8有時(shí)候你需要判斷一段數(shù)據(jù)到底是不是合法的UTF-8比如讀取配置文件時(shí)。utf8_validate遍歷整個(gè)字符串任何一步解碼失敗就返回0int utf8_validate(const char *s) { const unsigned char *p (const unsigned char *)s; while (*p) { uint32_t cp; int len utf8_decode(p, cp); if (len 0) return 0; p len; } return 1; }配合前面說的最短編碼校驗(yàn)這個(gè)函數(shù)能擋住絕大多數(shù)畸形數(shù)據(jù)。我在處理用戶上傳的文本文件時(shí)會(huì)先用它過一遍不合法就拒絕避免后續(xù)處理出問題。4.4 碼點(diǎn)和字符的相互轉(zhuǎn)換輔助還有兩個(gè)小工具很常用。一個(gè)是把碼點(diǎn)轉(zhuǎn)成可讀的十六進(jìn)制字符串方便調(diào)試打印void codepoint_to_hex(uint32_t cp, char *buf) { sprintf(buf, U%04X, cp); }另一個(gè)是判斷某個(gè)碼點(diǎn)是不是ASCII這在做文本分析時(shí)經(jīng)常需要int is_ascii(uint32_t cp) { return cp 0x7F; }別看這些函數(shù)簡(jiǎn)單組合起來就能搭出一個(gè)夠用的文本處理層。關(guān)鍵是它們都不依賴任何第三方庫純標(biāo)準(zhǔn)Cstring.h和stdint.h就夠了。5. 實(shí)測(cè)中踩到的坑和排查過程代碼寫完了不代表能用。我在實(shí)際測(cè)試中遇到了一連串問題這里把排查過程完整還原出來因?yàn)檫@些問題很可能你也會(huì)遇到。5.1 第一個(gè)坑有符號(hào)char導(dǎo)致的判斷錯(cuò)誤最開始我的解碼函數(shù)參數(shù)是const char *結(jié)果在處理高位字節(jié)時(shí)出了詭異的問題。比如字節(jié)0xE4漢字中的首字節(jié)在char是有符號(hào)類型的平臺(tái)上它會(huì)被解釋成負(fù)數(shù)-28。這時(shí)候b0 0x80這個(gè)判斷居然成立了因?yàn)?-28 確實(shí)小于 128于是函數(shù)把它當(dāng)成ASCII字符處理直接返回了錯(cuò)誤的碼點(diǎn)。排查這個(gè)問題的過程很典型我打印出每個(gè)字節(jié)的十六進(jìn)制值發(fā)現(xiàn)首字節(jié)明明是0xE4但程序走進(jìn)了一字節(jié)分支。盯著代碼看了半天才意識(shí)到是符號(hào)問題。解決辦法很簡(jiǎn)單所有處理字節(jié)的指針和變量一律用unsigned char。這個(gè)教訓(xùn)讓我養(yǎng)成了一個(gè)習(xí)慣凡是涉及字節(jié)操作的代碼unsigned char是默認(rèn)選擇。5.2 第二個(gè)坑緩沖區(qū)邊界與文件讀取我的工具需要從文件讀取內(nèi)容。第一版我用fseekftell拿到文件大小然后malloc對(duì)應(yīng)大小的緩沖區(qū)再fread一次性讀入。測(cè)試小文件沒問題但處理一個(gè)幾十兆的日志文件時(shí)崩潰了。用調(diào)試器跟進(jìn)去發(fā)現(xiàn)ftell返回的大小和實(shí)際讀到的字節(jié)數(shù)對(duì)不上。原因是文件是以文本模式打開的在某些平臺(tái)上換行符會(huì)被轉(zhuǎn)換導(dǎo)致實(shí)際字節(jié)數(shù)和ftell報(bào)告的不一致。改成二進(jìn)制模式打開rb后問題解決。這個(gè)坑在跨平臺(tái)時(shí)特別容易踩因?yàn)椴煌到y(tǒng)對(duì)文本模式的處理不一樣。另外ftell返回的是long類型在32位平臺(tái)上最大只有2GB。如果要處理更大的文件得用fseeko/ftello或者分塊讀取。我后來改成了分塊讀取的方式每次讀4KB邊讀邊處理內(nèi)存占用也小了很多。5.3 第三個(gè)坑BOM頭的處理從Windows上創(chuàng)建的UTF-8文件開頭往往會(huì)有一個(gè)BOMByte Order Mark字節(jié)序列是EF BB BF。這個(gè)BOM不是文本內(nèi)容的一部分但如果你不處理它utf8_strlen會(huì)把它算成一個(gè)字符顯示的時(shí)候也會(huì)多出一個(gè)看不見的字符。我一開始沒注意直到發(fā)現(xiàn)同一段文本在Windows記事本和Linux編輯器里顯示的長(zhǎng)度不一樣。排查時(shí)把文件頭幾個(gè)字節(jié)打印出來看到了EF BB BF才恍然大悟。處理辦法是在讀取文件后檢查開頭三個(gè)字節(jié)如果是BOM就跳過if (len 3 (unsigned char)buf[0] 0xEF (unsigned char)buf[1] 0xBB (unsigned char)buf[2] 0xBF) { memmove(buf, buf 3, len - 3); len - 3; }用memmove而不是memcpy因?yàn)樵春湍繕?biāo)內(nèi)存區(qū)域有重疊。這個(gè)細(xì)節(jié)如果搞錯(cuò)數(shù)據(jù)會(huì)被破壞。5.4 第四個(gè)坑代理區(qū)碼點(diǎn)的編碼前面編碼函數(shù)里我加了代理區(qū)的檢查但第一版沒有。測(cè)試時(shí)我故意構(gòu)造了一個(gè)碼點(diǎn) UD800 去編碼結(jié)果編出來一個(gè)3字節(jié)序列解碼回來還是 UD800看起來正常。但這個(gè)碼點(diǎn)在Unicode標(biāo)準(zhǔn)里是明確禁止單獨(dú)使用的它是為UTF-16的代理對(duì)保留的。雖然自編自解看起來沒問題但如果這個(gè)字節(jié)序列被其他程序處理就可能出問題。所以編碼時(shí)一定要拒絕代理區(qū)碼點(diǎn)。這個(gè)檢查加上之后我的utf8_encode才算真正健壯。5.5 排查工具一個(gè)簡(jiǎn)單的十六進(jìn)制打印函數(shù)上面這些問題的排查都離不開一個(gè)工具把字節(jié)按十六進(jìn)制打印出來。我寫了一個(gè)小函數(shù)調(diào)試時(shí)非常有用void hexdump(const unsigned char *data, size_t len) { for (size_t i 0; i len; i) { printf(%02X , data[i]); if ((i 1) % 16 0) printf(\n); } printf(\n); }遇到編碼問題時(shí)先用它把原始字節(jié)打出來對(duì)照UTF-8模板表一看問題往往就清楚了。這個(gè)習(xí)慣幫我省了大量時(shí)間。6. 完整可用的代碼組織與測(cè)試方法6.1 文件劃分建議雖然所有代碼可以塞進(jìn)一個(gè)文件但為了可維護(hù)性我建議分成兩個(gè)文件utf8.h放函數(shù)聲明和必要的類型定義utf8.c放實(shí)現(xiàn)。頭文件里加上防止重復(fù)包含的宏#ifndef UTF8_H #define UTF8_H #include stdint.h #include stddef.h int utf8_encode(uint32_t cp, unsigned char *out); int utf8_decode(const unsigned char *in, uint32_t *cp); size_t utf8_strlen(const char *s); size_t utf8_truncate(const char *s, size_t max_chars, char *out, size_t out_size); int utf8_validate(const char *s); #endif這樣其他項(xiàng)目要用直接拷貝這兩個(gè)文件就行零依賴。6.2 測(cè)試用例的設(shè)計(jì)自己寫的編解碼一定要有測(cè)試。我設(shè)計(jì)了幾組用例覆蓋各種邊界測(cè)試內(nèi)容輸入期望輸出ASCII單字節(jié)A長(zhǎng)度1碼點(diǎn)0x412字節(jié)邊界U0080編碼為C2 803字節(jié)中文中編碼為E4 B8 AD4字節(jié)emoji U1F600編碼為F0 9F 98 80最大碼點(diǎn)U10FFFF編碼為F4 8F BF BF非法代理區(qū)UD800編碼返回-1過長(zhǎng)編碼C1 81解碼返回-1截?cái)嗟男蛄蠩4 B8解碼返回-1特別要測(cè)的是往返一致性隨機(jī)生成一批合法碼點(diǎn)編碼后再解碼看是否和原碼點(diǎn)相同。這個(gè)測(cè)試能發(fā)現(xiàn)絕大多數(shù)位運(yùn)算錯(cuò)誤。6.3 性能上的實(shí)測(cè)感受有人可能擔(dān)心手寫解碼的性能。我實(shí)測(cè)下來在普通筆記本上utf8_strlen處理100萬個(gè)字符的文本耗時(shí)在幾十毫秒級(jí)別完全夠用。瓶頸通常在文件IO而不是解碼本身。如果真有極致性能需求可以把解碼函數(shù)內(nèi)聯(lián)或者用查表法預(yù)計(jì)算首字節(jié)對(duì)應(yīng)的長(zhǎng)度但大多數(shù)場(chǎng)景沒必要。6.4 幾個(gè)實(shí)用的擴(kuò)展方向這套代碼跑通之后我又基于它做了幾個(gè)擴(kuò)展。一個(gè)是utf8_next返回下一個(gè)字符的指針方便寫遍歷循環(huán)另一個(gè)是utf8_to_upper只對(duì)ASCII部分做大寫轉(zhuǎn)換因?yàn)閁nicode的大小寫轉(zhuǎn)換規(guī)則很復(fù)雜涉及語言環(huán)境不適合簡(jiǎn)單實(shí)現(xiàn)。這些擴(kuò)展都是按需添加的核心的編解碼和工具函數(shù)保持穩(wěn)定。提示如果你的項(xiàng)目需要處理Unicode的大小寫轉(zhuǎn)換、正規(guī)化、排序等復(fù)雜操作那還是建議用成熟的庫。手寫實(shí)現(xiàn)適合的是識(shí)別字符邊界、計(jì)數(shù)、截?cái)?、?yàn)證這類基礎(chǔ)需求不要試圖用幾百行代碼去覆蓋整個(gè)Unicode標(biāo)準(zhǔn)。7. 關(guān)于零依賴實(shí)現(xiàn)的一點(diǎn)個(gè)人體會(huì)這套UTF-8工具函數(shù)從開始寫到測(cè)試通過前后花了大概一個(gè)下午。真正寫代碼的時(shí)間不多大部分時(shí)間花在調(diào)試那幾個(gè)坑上——有符號(hào)char、BOM頭、過長(zhǎng)編碼校驗(yàn)。這些問題的共同點(diǎn)是它們不會(huì)在正常輸入下暴露只有遇到邊界情況或者異常數(shù)據(jù)才會(huì)冒出來。我現(xiàn)在回頭看覺得最有價(jià)值的不是那幾百行代碼本身而是對(duì)UTF-8編碼規(guī)則的理解。以前看到E4 B8 AD這樣的字節(jié)序列是一頭霧水現(xiàn)在能一眼看出這是一個(gè)3字節(jié)的漢字能手動(dòng)算出它的碼點(diǎn)。這種看穿字節(jié)的能力在處理任何涉及文本的底層問題時(shí)都用得上。另外一點(diǎn)體會(huì)是零依賴不等于重復(fù)造輪子。當(dāng)項(xiàng)目約束允許用庫的時(shí)候用庫是更明智的選擇因?yàn)槌墒斓膸旖?jīng)過了大量測(cè)試覆蓋了各種邊界情況。但當(dāng)你被迫要自己實(shí)現(xiàn)時(shí)理解原理能讓你寫出正確且健壯的代碼而不是抄一段看起來能跑、實(shí)際到處是坑的代碼。這兩者之間的差別往往就體現(xiàn)在那幾個(gè)不起眼的校驗(yàn)和邊界判斷上。如果你也在做類似的事情我的建議是先把模板表背熟然后老老實(shí)實(shí)把每個(gè)邊界用例都測(cè)一遍尤其是非法輸入。編解碼的正確性靠的不是聰明而是對(duì)每一個(gè)字節(jié)的較真。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
国产日韩精品SUV| 综合色久| 六月亚洲婷婷6月中文字幕| 深爱五月天| 这里只有精品热| 丁香五月-激情综合| 婷婷五月天六点丁香五月| 欧美日韩国产一区| 大香蕉久久综合网| 五月香婷婷| 色5月婷婷| 91青娱乐青青草| 九九热精品| 日韩婷婷五月| 日本久久人人| www,久久久人人| 六月婷婷激情| 91九色精品| 婷婷基地成人五月天| 五月色婷婷夜色| 五月色婷| 久久激情五月天| 激情婷婷另类| 激情综合网五月天天| 免费成人中文字幕| 色色色色色色综合网| 91婷婷在线| 色噜噜狠狠狠综合曰曰曰| 婷婷玖玖五月天| 国产精品久久久久久亚洲毛片| 人人播| 婷婷丁香射射| 色噜噜狠狠色综合伊人| 九九热在线观看6| 秋霞网在线免费基地五月婷婷丁香| 丁香五月天色婷婷| 欧美99| 亭亭玉月丁香| 99热只有| 丁香五月婷婷五月天| 婷婷色五月久久| 丁香五月婷婷啪啪| 亚洲精品国产setv| 丁香色色网| 能看的AV| 日婷婷久久开心| 久久狠狠色| 狠狠爱综合| 9 1 A v久久久| 色级停停| 婷婷国产五月天17c| 国产日韩欧美| 色九四色| 一区二区三区四区牛| 婷婷五月天97干| 狠狠干在线| 91九色欧美| 五月天激情av| 婷婷综合在线观看视频| 五月婷婷之美女图片| 五月综合激情图片 | 婷婷开心五月| 夜夜躁婷婷AV| 午夜大香蕉| 99热9999| 久久机热这里只有精品| 天天插AV丝袜中| 色五月婷婷婷婷| 天天草天天日| 六月婷婷色综合| 婷婷五月花丁香| 天天肏天天爽夜夜爽| 五月婷人妻| 婷婷五月激情丁香激情| 丁香婷婷视频一区二区| 五月丁香成人网| 五月亭亭网成人在线视频| 国产亚洲色婷婷久久99精品91| av成人在线播放| 久操欧美在线观看97| 日99网站| 久久五月天色婷婷| 91精品熟女| 六月丁香激情最新更新| 天天干天干| 五月丁香六月婷婷激情网| 亚洲婷婷基地| 乱乱av| 婷婷狠狠干| 在线五月婷| 狠狠综合久久综合| 天天射影| 九九热在线视频观看| 色五月婷婷一二| 日本色久| 中文字幕免费高清电视剧| j五月香在线| 久久人操-久草婷婷-成人AV| 五月丁香六月婷婷,婷| 草操网| 国产婷婷五月天| 五月婷婷丁香五月| 激情五月婷婷| 五月婷婷激情网| 色播五月丁香婷婷| 亚洲精色| 涩涩五月天| 五月婷三级片| 婷婷色激情网| 日本久久人| 99免费在线视频| 91九九精品| 精品久久99码| 免费亚洲婷婷| 五月天色软件| 婷婷区日本| 欧美婷婷五月天| 九九热最新| 99热官网精品在线| 久久欧洲综合网| 伊人www22综合色| 亚洲春色奇米影视| 婷激情五月天视频导航| 天天操B| 人人色人人弄人人操| 99ri视频在线观看| 激情亚洲婷婷六月| 国产一区二区三区影院| 91丨九色丨东北熟女| 思思久日精品视频| 大伊香蕉精品视频在线| 激情婷婷综合| 五月丁香影院| 亚洲色色色色色| 日韩AV大全| 内射爽无广熟女亚洲| 色婷婷啪啪啪啪啪啪| 色综合网综合| 韩国中文字幕91| 99热国产婷婷| 五月婷婷亚洲色视频| av亚洲国产小电影| 激情五月亚洲综合网| 中文字幕综合网| 92久操视频| 激情五月婷婷网在线观看| 婷婷五月色播| 大香蕉中文| 色综合色欲综合天天免费| 97欧美在线| 婷婷五月色花丁香社区| 色亭亭五月天丁香综合AV - 百度 - 百度| 超碰免费人人肏| 老司机午夜福利视频金瓶梅| 国产SUV精品一区二区6| 26UUU亚洲欧美| 色色色99| 五月婷庭丁香在线| 激情综合色婷婷啪啪五月天| 丁香五月 六月婷婷首页| 天天天干夜夜夜操| 五月香蕉婷婷| 香蕉曰比| 五月天天天天天天天天天天天婷婷婷| 丁香五月婷婷偷拍| 91精品久久久久久| 96人人操人人操人人| 久色网| 久热 91| 亚洲成人中心| 丁香亭亭久久| 日本女色人人| 激情五月婷婷开心网| 亚洲啪啪自拍| 亚洲午夜视频| 99视频久久免费视频| 五月天激情久久| 五月天激情小说| 日韩视频99| 一起草av| 国产成人片| 六月丁香婷啪射| 8090在线影视少妇| 婷五月天| 色五月婷婷激情综合网| 国产干逼片| 深爱激情网综合| 色天堂操| 99热在线播放| 啪啪小说五月天| 激情婷婷视频在线| 激情小说五月天| 天天爽天天爽天天爽天天爽天天爽天天爽天天| 中文字幕乱码亚洲精品一区| 色色网站| 99热 在线观看| 亚洲成人无码专区| 九九热啪啪| 国产xxxxx在线观看| 免费看欧美成人A片无码| 九月婷婷丁香| 任你操精品免费| www.91久久| 69激情小说| 久久久久久久久久婷婷| 免费精品99| 五月婷婷黄色视频| 五月停亭六月,六月停亭的英语| 激情五月天综合网| 九九成人视频| 99热精品9| 97色色婷婷五月天| 色综合99无码 | h亚洲| 精品久久久人妻| 先锋资源 996| 大香蕉啪啪啪| 九月色婷婷综合| 五月大香蕉| 综合色色色| 六月五月丁香五月欧美| 九九综合图片网| 99在线观看| 天天色综网| 婷婷丁香视频在线观看免费| 91久久九久久九久久九久久九久久| 五月丁香影视| 九九久久99精品免费观看www| 岛国资源网| 日本久久爽| 成人做爰黄A片免费看直播室男男| 噜一噜在线| 91dy.av| 激情99热| 欧美人人女女精品综合五月天| 伊人99热| 婷婷五月天激情网| 欧美色五月| 婷婷五月天亚洲激情戏精品| 狠狠搞五月天| 丁香无月在线观看| 九月激情网| 综合久久十| 色999;丁香五月| 色色com| 日本一级一级一级一级| 开心五月激情网| 五月天怕怕| 伊人香大香蕉视频| 淫五月停停| 99re在线观看| 欧美激情综合| 午夜性做爰电影| 成人午夜无码视频| 欧美日韩91| 91无码高清| 这里只有精品9| www.99热视频在线观看| www.激情在线| bbwcuckold精品熟妇| 天堂久久婷婷| 五月婷婷基地| 久久久久亚洲A∨成人乱码电影| 超碰免费成人| 俺也去婷婷五月天第五色| 五月天丁香欧美激情| 一二线视频 另类| 狠狠操狠狠| 超碰在线成人| 国产真实乱对白精彩| 粉嫩AV久久一区二区三区| 色99色| 五月天激情电影| 日韩人妻无码专区| 99精品网| 男人的天堂在线婷婷| 成人国产欧美大片一区| 日韩无码亚欧无码| 天天综合五月| 五月天色婷好好| 这里只有精品日韩| 亚洲99在线视频| 国产精品久久久久久五月天加勒比 | 五月天综合久久| 欧美黄色韩日网| 久久爱婷婷| 噜噜色五月| 97碰| 免费视频WWW在线观看网站| 久久伊人五月天| 亚洲成av人影院| 在线看片h站| 性爱视频久久| 五月婷婷亚洲色图| 五月天激情小说| 五月丁欧美| 色婷婷五月天天天天天天天天天| WWW,婷婷,COM| 久久久18| 色播综合| www.刺激色网站www.| 九九色院| 五月天激情国产综合AV| 亚洲成人网在线观看| www.超碰在线| 色五月综合网站| 成人网站av免费网站推荐| 五月婷婷激情网| 激情综合婷婷| 久热 91| 大地9中文在线观看免费高清| 99热每日| site:xmssd.com| 久久精品66| 久久久99免费视频| 微拍92| 91丨九色丨43老版熟女| 开心五月深爱婷婷| 激情综合五月| 五月天婷婷香蕉狠狠超碰综合| 无码一区二区日韩| www.色五月.com| 成人做爰高潮A片免费视频| 狠狠色婷| 五月婷婷开心爱| 99无码视频| 欧美性猛交 XXXX 乱大交| 热婷婷久| 婷婷五月AV| 五月婷婷色综图片| 人操人| 欧美欧盟性爱网| 吾爱AV导航| 久久黄色免费视频| 五月丁香欧美综合| 天天射天天操天天干| 热99国产精品| 51XX午夜影福利| av操B网站| 丁香亭亭久久| 亚洲高清在线| 综合久久五月天| 亚洲丁香五月| 五月丁香婷婷伊人| www.婷婷网| 婷婷中文字幕| 成人人操| 99热99热在线| 久婷视频| 婷婷色五月天在线观看| 啪啪五月婷婷| 婷婷色丁香六月| 少妇AB又爽又紧无码网站| 五月婷婷久久综合| 日韩成人综合网| 久草网大香视频| 婷婷四色五月| 狠狠搞狠狠操| 欧美色狠婷久| 激情视频网址| 欧美日韩大黄| 欧美69久成人做爰视频| 欧美综合婷婷网| 五月激情综合网| 91干视频| 五月丁香六月婷婷网| 在线观看欧美| 天天射综合网站| 免费黄色AV| 婷婷 丁香 精品| 97婷婷久久丁香| 色色色色色网站| 亚洲xx在线| 激情九九这里只有精品| 亚洲成人综合网在线免费观看| 欧洲亚洲激情五月天在线| 国产99久久久国产精品免费看 | 99在线观看| 蜜桃人妻无码AV天堂三区| 99热99思午夜精品| 日本美女上人| 欧美又粗又大一区二区在线观看| 成人在线二区| 激情五月婷婷六月丁香| 欧美激情综合色综合啪啪五月| 色5月婷婷| 九月性爱网| 骚。com| 久久伊人婷| 丁香五月婷婷AV在线| 亚洲4区国产欧美| 婷婷五月天丁香社区| 超碰色婷婷| www色婷婷| 久久精品色| 日本人妻伦在线中文字幕| 秋霞学生妹一二级| 伊人九九九久| 欧美日韩99| 久久久久婷婷五月热综合| 亚洲精品又粗又大又爽A片| 亚洲VA在线| 97国产精品女人碰碰| 亚洲六月婷婷| 九九视频这里只有精品在线播放| 97色射| 亚洲色五月天| 天天日夜夜高潮| 免費观看aV在线网址| 色婷婷日本| 久热99| 国产偷人爽久久久久久老妇APP| 丁香五月婷在线| 亚洲AV综合网| 狠狠干综合| 五月天激情国产综合婷婷婷| 丁香五月天电影| 欧美婷婷| 丁香六月婷婷社区| 北京熟妇搡BBBB搡BBBB| 99在线免费视频| 狠狠操之狠狠操| 久久久亚洲成人无码A片| 激情99| 婷婷五月天成人动漫 | 9色免费网| 99精品久久久久久久婷婷| 天天插轮理| 天堂成人久久| 九九九干精品| 五月天精品| 99热精品免费| 久久丁香五月婷婷| 99er6| 99视频网址| 嫩草AV久久伊人妇女超级A| 亚洲五月丁香六月婷婷| 中文字幕成人影视| 丁香五月欧美婷婷综合| 99综合| 天天搞天天色综合| 开心五月婷婷婷美女| 伊人大香五月天| 99在线一区| 国产人妻人伦精品一区二区| 综合网色| 超碰91人人操| 婷婷五月天综合AV| 亭亭五月色男人| 色宗合,宗合网| 丁香九月婷| 色五月大香蕉婷婷| 丁香五月 激情文学| 国产看真人毛片爱做A片 | 99re久久| 黄色AV日韩| 激情五月天影院| 99热骚货| 久久这里99| 97干网站| 五月婷在线影院| 综合网色综合| 婷婷五月a| 五月天婷婷无码| 国产在线aaa片一区二区99| www.日日夜夜.com| 色婷婷视频| 九九无码| av在线观看网站| 婷婷五月天福利| 99re热视频这里只精品| 青青草成人网| 99激情视频| 日狠狠| 思思热精品在线| 5月婷婷五月天| 五月婷婷激情综合拍| 日日激情网| 婷婷五月噜噜| 日韩AAAAAAAAAAA片| 激情五月网站| www夜夜操wwwcon| 亚洲综合字幕色色| 色久婷婷网| 五月婷高清视频| 综合99在线| 狠狠干2007| 婷婷六月插屄激情| 97丁香五月| 99热这里只有精品免费观看| 天天综合精品| 激情婷婷| 免费观看全黄做爰的视频| 666555。COm毛片| 欧美精品狠狠色丁香婷婷| 99精品综合在线| 六月婷婷最新网址| 久操大香蕉| 婷婷五月黄色激情在线| 丁香五月天综合网| 六月婷婷啪啪| 免费视频无码| 伊人久热91| 超碰在线9| 99久久久久| 亚洲性图一区二区三区| 新伍月婷婷| 99在线免费视频| 91精品丝袜久久久久久| 国产小精品| 丁香花综合永久入口| 四川操逼站| 亚洲色碰| 99成人精品视频| 五月婷婷丁香啪啪| 亚洲婷婷五月天| 色婷婷丁香AV综合| 丁香五月激情六月欧亚激情综合导航| av在线色五月丁香婷区久| 五月在线| 91九九| 91九色PORNY肉丝在线| 婷婷中文字幕网| 丁香五月天激情网址| 岛国av电影网站| www.五月婷婷.com| 琪琪色网在线| 五月丁香好婷婷A片网| www.激情五月天.com| 激情丁香六月| 五月丁香激情综合网| AV六月丁香| 日日日,com| 99在线精品视频在线观看| 激情五月天在线视频| 久综合九综合99| 99re66热这里只有精品| 热久精品| 五月天色软件| 婷婷的五月天另类视频| 日韩成人中文字幕| 99ER热精品视频| 香蕉国产2013| 色色AV色色色东莞| 夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂亚洲亚洲亚洲亚洲亚洲亚洲亚洲亚洲色 | 大香蕉天堂色| 五月丁香天堂网婷婷| 婷婷久久99| 五月天久久小说| 丁香五月婷婷婷婷欧美综合| 婷婷五月天六月| 色色热| 五月婷婷99热| 久99久热只有精品国产99| 99久久婷婷国产综合| 色狠狠色噜噜AV天堂五区| 日韩在线视频网站| 五月色综合| 色天使色综合| 五月综合婷婷久久在线| 伊人无码高清| 五月丁香婷婷无码中文| 中文字幕在线日亚州9| 97伊人综合婷婷| 思思久日精品视频| 婷婷天堂站| 97碰久久| 色综合色五月| 综合激情在线视频| 婷婷午夜精品久久久| 久热AⅤ| 久久九九大香蕉电院| 日韩丰满少妇无码内射| 婷婷丁香成人在线视频| 狠狠干无码| 婷婷五月天激情综合| 婷婷五月天AV在线| 99爽视频| www.91色| 狠狠色噜噜狠狠色噜噜噜999| 日韩婷婷| 久久狠狠欧美| 激情深爱五月天| 天天色综和网| CHINESE熟女老女人HD视频| 婷婷五月天中文字幕.| 激情五月婷婷视频一区二区三区| 久久婷婷五月国产色综合激情| 亚洲色频| 亚洲综合网区| 成人无码精品1区2区3区免费看| 一区二区中文字幕| 99热超碰| 最新午夜理论片| 免费无码毛片一区二区A片| 狠狠操综合| 久草五月天| 99色看这里只有精品| 中字幕视频在线永久在线观看免费| 伊人久久婷婷五月天激情四射| 人人插操| 婷婷久久综合| 久操b网| 91打屁股免费看| 夜夜骑福利资源| 色色综合热| 操操自拍| 亚洲激情五月婷婷日日| 五月丁香花激情啪啪网| 大香蕉五月丁香| 这里只有精彩小视频视频网站| 激情五月综合色婷婷| 日日夜夜天天综合| 涩涩五| 99久热在线精品99re6热| EEUSS鲁片一区二区三区| 久婷五月| www.色99| 久久婷婷六月综合| 99热大全在线观看| 人妻有码乱操| 色中色综合| 99re热久久| 97热九九| 99久久国产宗和精品1上映| 桔色成人在线| 色婷婷六月性| 超色欲天天| 婷婷五月av| 国产综合网在线| 超碰在线国产| 婷婷五月开心六月AV| 五月激情六月宗合| 婷婷播5月| 热99精品视频在线观看| 婷婷久久图片| 五月丁香大香蕉| 精品三区影院| 立川无码av| 综合www色| 久久久国产精品黄毛片| 日本九九视频| 一级操逼内射在线视频| 欧洲激情五月天婷婷| 五月婷婷综合性爱噜噜| 狠狠激情五月天| 色色五月丁香婷婷| 香蕉中文在线| 最近中文字幕2019视频1| 人妻九九九九| 99A片| 久久 这里只有精品1| 久久婷婷激情| 五月丁香综合中文| 强奸幻女毛片| 九九九九九999999| 婷婷五月成人| 婷婷社区五月天| 日日夜夜狠狠| 婷婷五月天色| 天天色天天色天天色天天色天天色| 看黄的网站18禁| 色综合久久88色综合天天看| CAOBIBI| 最新无毒无码AV| 色玖玖| 亚洲天堂aaaa| 成人丁香五月| 俺也去在线视频| 黄涩毛片| 五月婷婷五月天天| 99色色网站| 丁香五月在线人妻| 午夜天堂啪啪| 五月天婷婷色| 99热免费精品热久久66| 久久婷婷五月综合97色一本| 日韩成人无码人妻| 婷婷综合在线| 天天日天天添| 天天综合色丁香| 狠狠五月激情在线| 在线播放成人网站| 大香蕉啪啪网| 婷婷第六色| 激情五月婷婷免费视频| 天天日夜夜高潮| 国产伊人五月天| 婷婷欧美偷拍综合| 色综合色综合色综合高潮| 激情美女五月天| 狠狠色五月激情| 侠女刀之记忆电影在线看免费| 91干视频| 成人噜噜网| 日本精品。999| 中文aV网| 99热无码首页| 天堂久久性| 成人av在线网站| 亚洲成人五月天| 色综合色色| 99年操人人爽| 亚洲无码九九九| 人人操人人爽成人AV| 丁香婷婷黄网站| 五月婷婷激情综合| 66久久视频在线| 五月丁香激情深爱婷婷| 狠狠艹狠狠艹| 久婷婷视平| 五月天色色色色色| 99在线观看| 五月婷婷开心爱| 五月丁香婷婷激情澎湃四射| 丁香五月激情综合| 九色婷婷| 欧美婷婷综合| 大香蕉九操| 五月丁香狠狠爱婷婷综合| 五月丁香狠狠| 婷婷99狠狠躁天天| 超碰人妻公开在线| …亚洲黄色在线播放日韩、av中文a…| 狠狠爱综合| 操嫩逼电影| 亚洲人妻电影| 桃色五月天| 欧美日本高清视频99| 99热精品在线| 思思精品热在线| 久久综合中文| 丁香五月桃花在线激情综合| 九九色人| 色五月婷婷内射| 色五月色五天色情网| 色五月激情| 99精品综合在线| 99视频内射三四| 99热的无码| 天天干狠狠| 91免费试看| site:xiongshengzz.com| 激情丁香图片| 少妇性按摩无码中文A片| 久久婷婷免费| 五月婷婷色播视频| 五月激情小说| 91打屁股免费看| 超碰在线人妻| 高清无码视频网址| 日韩人妻AV在线| 日韩五月婷婷| 欧美色色色| 五月天狠狠| 激情婷婷九月| 色五婷婷| 97夫妻超碰| 久久激情视频99| 亚洲精品五月| 中文毛片无遮挡高潮免费| 日韩久久色| 久热这里只有精品99re| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 亚洲AV无码成人精品区电影网| 丁香五月98| 欧美25p| 影音先锋AV男人站| 伊人在线婷婷草| 色噜噜婷婷| 激情五月天视频| h亚洲| www,婷婷,com| 激情WWW| 啪啪一区| 激情五婷网| 天天日天天色| 激情婷婷视频在线| 五月天综合在线观看| 亚洲欧美综合7777色亭亭| 婷婷久久免费看| 96丁香六月婷婷蜜桃综合久久| 欧美色色色色色色色色色色| 欧洲亚洲精品| 99免费青青蜜臀| 俺去也五月天婷婷| 开心久久网婷婷| 婷婷瑟瑟五月天| 九九色插| 夜夜爽天天干| 99久久精彩视频| 色五月AV| 色婷婷综合综合网| 超碰91人人操| 日本99久久| 天天爱天天做天天操| 99色精品视频| 五月丁香激情综合网| 国产六月婷婷| 极品人妻VIDEOSSS人妻| 天天色色婷婷| 男人的天堂av俄罗斯热| 激情五月丁香亭亭 | 综合天堂AV久久久久久久| 日本狠狠爽| 91色色五月天| 人人干Av| 丁香九色不卡aaa| 99视频在线观看网址| 视频久久9| 婷婷色五月丁香六月欧美啪| 激情婷婷人妻| 绿色小导航AV| 天天爽天天操| 五月综合色播播丁香婷婷| 伊人9在线| 亚洲激情网| 综合激情五月天六月婷免费视频| 国产免费一区二区三区三州老师F1F1.CC | www.狠狠艹| www.99色在线| 啪色综合| 美女五月激情| 亚洲mm免费| 久久五月综合| 九九re精品视频在线观看| 思思热视频在线| 色色色色色色97| 97久久超级| 99久在线精品| 开心日韩丁香婷婷五月| 9精品一区| 成人片在线播放| 六月色色综合| 丁香五月激情欧美| 五月天激情国产综合婷婷婷| 99热只有这里才是精品| 啪啪黄页网| 99热超碰在线| 五月丁香六月色婷婷| 婷婷五月色情| 欧美槡BBBB槡BBB少妇| cc精品国产性传播| 中文字幕在线免费观看视频| 久久91久久精品久久| 亚洲成人av在线| 清色五月天| 六月色婷婷综合影视| 九色婷婷| www.婷婷| 色五月婷婷丁香婷婷| 99热精品网| 国产真人做爰视频免费| 综合网啪| 精品少妇蜜臀91| 九九色99| 天啪天啪天啪天啪| 99热在线观看| 五月天婷婷成人资源站| 亚洲欧美综合7777色婷婷| 2018夜夜草| 五月婷婷,六月丁香| 99色视频免费在线规看| 久久人妻爱爱| 欧美三级欧美一级| Av在线不卡一区| 五月天激情小说网| 久久多色| 亚洲成人五月天| 五月丁香婷婷激情| 天天性视频| 大香蕉Av在线| 丁香五月熟女| 丁香五月花| 五月天播播| 日本三久久| 激情五月婷婷六月丁香| 婷婷五月激情基地| 亚洲思思热久| 九九色大香蕉| 久久色吧| 六月婷婷天堂| 欧美情色一区| www.激情| 亚洲熟妇AV乱码在线观看| 亚洲人妻av| 婷婷久久综合| 五月丁香影院| 成功精品影院| 欧洲第一无人区观看| 狠狠穞A片一區二區三區| 五月丁香啪啪综合| 婷婷五月色天| 五月天大香蕉| 性色做爰片在线观看WW| 少妇性BBB搡BBB爽爽爽视頻| 婷婷五月天福利| 丁香六月婷婷综合| 777精品久无码人妻蜜桃| 精品成人无码A片观看香草视频| 高清无码网址| 亚洲免费综合一区| 亚洲9久久精品| 9色免费网| 久久婷婷夜| 欧美日韩123| 婷婷六月丁香激情| 六月激情婷婷色| 婷婷六月色情| 99热在这里只有精品| 神马欧美精| 色色激情| 香蕉AV777XXX色综合一区| 日韩黄在免| 欧美超碰亚洲| AV在线观看网站| 久久久精品99亚洲综合| 爱的综合网| 色欲色香伊人| 五月丁香婷婷中文| 丁香五月激情网| caop视频| 欧美日韩成人在线免费| 99热啪啪| 成年人99热| 99只有精品| 少妇激情五月天| 五月婷婷涩涩爱| 99在线综合视频| 婷婷伊人中文字幕| 激情黄色五月天| 少妇达人正片在线播放_ikun_福利吧| 欧美综合123区| 无码少妇高潮喷水A片免费| 99热亚洲只有色| 精品99在线| 南京搡BBBB搡BBBB| 婷婷五月天色播| 激情综合网色播五月| 五月美女婷婷风骚| 亚洲无码11| 五月婷伊人| 丁香五月天激情综合| 五月综合视频| 97婷婷久久丁香| 最新热中文字幕| 丁香激情综合| 激情五月丁香五月| 狠狠综合色网| 五月丁香激情综合欧美| 亚洲午夜电影| 五月丁香婷婷成人网| 激情丁香九九五月综合网| 色播播之激情五月婷婷| 操日视频| 91九色超碰| 大香蕉久操| 五月丁香婷婷成人综合网| 九九久久网| 日韩成人电影Av| 婷婷五月丁香在线观看| 丁香五月激情网| 清纯唯美 激情四射| 欧美日朝成人| 色综合激情| 三年高清大片免费观看国语| 91精品国产99久久久久久天美| 丁香婷婷伊人| 色婷婷在线视频| 任你搞网站| 婷婷五月天激情诱惑| 婷婷综合| 综合久久婷婷| 人妻少妇色综合| 五月丁香婷婷钟和色图| 26UUU| 久久综合中文字幕| www久久久久久久久久久久久久久久久| 九久9精品| 色综合色| 91碰碰碰久久久久| 99热这里只有精品69| 婷婷丁香十月| 色婷婷丁香综合中文字幕| 性爱视频99| 免费色婷婷| 天天撸夜夜爽| 欧美交换配乱吟粗大25P| 热99这里只是精品| 丁香五月欧美成人| 9精品视频在线| 六月婷婷五月天| 久久久亚洲成人无码A片| 五月婷婷久久爱| 五月丁香综合网| 欧美群妇大交乱婬网| 成人电影一区| 色色免费网站| 久久婷婷综合网| www98日本小时间到了| 亚洲精品色| 亚洲色综久久五月| 国产日韩欧美性爱| 9久9久| 丁香六月婷婷| 五月亭亭欧美女人| 激情五月丁香亭亭| 五月婷婷九九久久| 色欲午夜无码久久久久久张津瑜 | 色综合色综合色综合高潮| 99这里只有精品| 再綫Av免费視品| 香蕉婷婷| 婷婷五月欧美综合| 内射在线CHINESE| 三十路磁力链接| 5月丁香美女影院| 色情五月天A片| 丁香狠狠色婷婷久久无码视频| 美英法精品无码免费视频| 五月婷婷伊| 激情丁香六月| 国产精品岛国片在线观看免费| 丁香五月偷拍| 大香蕉久艹| 婷婷丁香五月综合| 五月丁香六月婷婷综合网| 七七婷婷综合| 五月婷婷婷婷网| h亚洲| 九九视频这里只有精品| 青青草搞屄视频网站| 极品人妻VIDEOSSS人妻| 婷婷五月天成人网站| 国内久久久精品99| 97干网站| 久久五月天激情婷婷| 黄色三级毛片中字| 色丁香五月| 五月婷亚洲精品AV天堂| 爱射综合| 狠狠激情五月天| 人妻激情视频| 久久精品性爱| 99久久综合精品五月天| 五月天AV大香蕉| 五月婷婷片| 色五月激情基地| 九九九午夜视频| 天天搞天天爽| 亚洲色vA| 婷婷丁香色情| 少妇高潮A片无套内谢麻豆传| 婷婷五月伦理网站| www.五月婷婷| 韩日另类| 99国产精品久久久久久久久久久 | 婷婷丁香五月社区亚洲| 五月婷婷色播| 天天成人综合| 五月花激情网| 婷婷五月天激情网| 淑女丝袜bi操逼123| 怡红院 久久| 三日本无码| 激情伊人五月天| 欧洲第一久色| 色情五月婷婷| 色婷婷AV在线观看| 色情婷婷| 婷婷五月激情视频在线| 狠狠色婷婷7| 六月激情丁香一道本7777| 综合色色网| 亚洲第一综合| 少妇口诉沐足视频播放器网址| 大天天伊人| 91打屁股免费看| 91在线日| 五月伊人婷婷| 这里只有视频精品| 五月天婷婷情色| 亚洲丁香花五月丁香花| 狠狠干婷婷| 天天日天天草| 婷婷五月综合在线视频| 亚洲精品视频在线播放| 久久天堂色| 全部老头和老太XXXXX| 91性高潮久久久久久久久| 狠狠干五月丁香综合网| 亚洲小视频免费观看| 久9久成人精品视频| 日本色色视频| 丁香六月综合激情| 超碰成人免费| 五月天婷婷影院| 天天日天天干天天插天天射| 激情小说婷婷小说| 五月天久久www| 免费观看2018www黄色操逼网站| 久久er99热精品一区二区 | 国产三级片91| 97日日碰碰| 九九爱激情| 天天色情站| 九九热AV| 99色免费观看全部| www.久久综合| 天天干天天干天天干天天干天| 狠狠擼综合| 一夜福利不卡| 五月丁香手机在线| 五月综合激情| 日韩欧美成人片| 99久久.www| www99xxxx五月丁| 操草草草| 色无婷婷| 国产乱人偷精品人妻A片| 我爱大香蕉| 夜夜操狠狠操| 欧洲色| 色婷婷久久| 婷婷五月激情中文字幕| 久久性爱视频| 国产成人+综合亚洲+天堂| www.婷婷六月天| 五月天操逼网| PORNY九色9l自拍视频成人| 在线观看av网站| 久久3p| 爽极品色| 五月婷婷五月天| 欧美精品999| 一级性爱视频| 三级三久久线久久99久目本WW| 久久99网| 黄网在线播放| A片试看50分钟做受视频| 色偷偷AV亚洲男人的天堂| 国产真实乱了老女人视频| 九九九九精品精| 99热草草| 一区二区传媒视频| 91精品又长又大又粗又爽又猛| 91久久久久久久91| 97碰超级人人看| 99色在线观看免费| 丁香五月六月婷婷自拍| 涩涩婷婷五月| 婷婷五月天亚洲| 精品99在线| 精品久久久人妻| 色综合天天| seuuu婷婷| 中日韩狠狠色| 色色婷| 亚洲激情五月婷婷日日| 玖玖资源天天无码| 天天玩夜夜操| 级情九色| 国产偷人爽久久久久久老妇APP| 丁香五月天久久| 激情婷婷五月天丁香| 久久资源网五月婷| 欧美激情五月天在线观看| 就99这里只有精品| 中文字幕免费高清电视剧| 欧美黑人巨大性生话| 猫咪伊人AV| 色婷婷丁香九月| 婷婷五月综合色中文字幕| 久久久人人人妻丝丝丝| 色播播五月天| 色婷五月天| 婷婷五月综合丁香久久| 碰97久久| 丁香六月高清视频| 五月激情六月丁香| 色色色999| 99久久天堂婷婷| 婷婷久热| www.狠狠干com| www,色婷婷| 精品夜夜澡人妻无码AV| 97超碰欧美中文字幕| 久久视屏这里只有久久| 激情网五月婷婷| 激情综合亚洲| 亚洲丁香婷婷| 人人操99| 五月激情婷婷六月| 天天综合在线网| 久热精彩视频98| 99精品国产在热久久| 这里只有精品网站| 婷婷五月激情小说| 人妻在线网站| 丁香五月色播中文在线播放| 天天插天天日| 大战熟女丰满人妻AV| 99热国内精品| 丁香婷在线| 色欲色香综合网| 92久操视频| 婷婷五月AA五月在线| 激情床戏| 岛囯综合激情网| 综合五月天亚洲婷婷| 思思热在线| 色婷婷呢狠禁久禁| 色五月激情视频在线综合| 婷婷六月丁香五月| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 琪琪色影音先锋| 678五月丁香亚洲综合| 超碰免费人妻| 久久九九囯产| 婷婷丁香一月| 另类激情中文| 26UUU欧美激情一区二区| 婷婷五月丁综合| WWW.桔色成人.COM| 99热伊人| 色婷婷a v| 九九热99在线视频| 亚洲综合在线丁香五月| 色色色热| 久久人人看| 丁香五月人妻| 五月天色站| 可以免费看AV网站| AV中文网| 五月丁香天天| 五月丁香六月婷综合成人综合| 色婷六月| 色天使色综合| 亚洲精品性色| 成熟妇人A片免费看网站| 人人玩人人橾| 99国产在线| 午夜大香蕉| 大香蕉人妻| 亚洲av综合网| 草草操操| 丁香婷婷黄网站| 99热新网址| 91九色熟女| 日本久久人人| 色狠狠综合网| 五月综合激情| 人妻激情在线| 人妻九九九九| 91成人视频| 五月婷亚洲精品AV天堂| 婷综合| 久久婷婷热| 日本久久99| 天天日天天舔| 99这里只有精品国产| 国产精品一区在线观看你懂的| 天天草天天爱| 日本一级黄色片。| 色综合色色色色色| 久久女人九九|