<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 66,  comments - 40,  trackbacks - 0

    1.?概述

    本文主要包括以下幾個方面:編碼基本知識,java,系統(tǒng)軟件,url,工具軟件等。

    在下面的描述中,將以"中文"兩個字為例,經(jīng)查表可以知道其GB2312編碼是"d6d0?cec4",Unicode編碼為"4e2d?6587",UTF編碼就是"e4b8ad?e69687"。注意,這兩個字沒有iso8859-1編碼,但可以用iso8859-1編碼來"表示"。

    2.?編碼基本知識

    最早的編碼是iso8859-1,和ascii編碼相似。但為了方便表示各種各樣的語言,逐漸出現(xiàn)了很多標準編碼,重要的有如下幾個。

    2.1.?iso8859-1

    屬于單字節(jié)編碼,最多能表示的字符范圍是0-255,應(yīng)用于英文系列。比如,字母a的編碼為0x61=97。

    很明顯,iso8859-1編碼表示的字符范圍很窄,無法表示中文字符。但是,由于是單字節(jié)編碼,和計算機最基礎(chǔ)的表示單位一致,所以很多時候,仍舊使用iso8859-1編碼來表示。而且在很多協(xié)議上,默認使用該編碼。比如,雖然"中文"兩個字不存在iso8859-1編碼,以gb2312編碼為例,應(yīng)該是"d6d0?cec4"兩個字符,使用iso8859-1編碼的時候則將它拆開為4個字節(jié)來表示:"d6?d0?ce?c4"(事實上,在進行存儲的時候,也是以字節(jié)為單位處理的)。而如果是UTF編碼,則是6個字節(jié)"e4?b8?ad?e6?96?87"。很明顯,這種表示方法還需要以另一種編碼為基礎(chǔ)。

    2.2.?GB2312/GBK

    這就是漢子的國標碼,專門用來表示漢字,是雙字節(jié)編碼,而英文字母和iso8859-1一致(兼容iso8859-1編碼)。其中g(shù)bk編碼能夠用來同時表示繁體字和簡體字,而gb2312只能表示簡體字,gbk是兼容gb2312編碼的。

    2.3.?unicode

    這是最統(tǒng)一的編碼,可以用來表示所有語言的字符,而且是定長雙字節(jié)(也有四字節(jié)的)編碼,包括英文字母在內(nèi)。所以可以說它是不兼容iso8859-1編碼的,也不兼容任何編碼。不過,相對于iso8859-1編碼來說,uniocode編碼只是在前面增加了一個0字節(jié),比如字母a為"00?61"。

    需要說明的是,定長編碼便于計算機處理(注意GB2312/GBK不是定長編碼),而unicode又可以用來表示所有字符,所以在很多軟件內(nèi)部是使用unicode編碼來處理的,比如java。

    2.4.?UTF

    考慮到unicode編碼不兼容iso8859-1編碼,而且容易占用更多的空間:因為對于英文字母,unicode也需要兩個字節(jié)來表示。所以unicode不便于傳輸和存儲。因此而產(chǎn)生了utf編碼,utf編碼兼容iso8859-1編碼,同時也可以用來表示所有語言的字符,不過,utf編碼是不定長編碼,每一個字符的長度從1-6個字節(jié)不等。另外,utf編碼自帶簡單的校驗功能。一般來講,英文字母都是用一個字節(jié)表示,而漢字使用三個字節(jié)。

    注意,雖然說utf是為了使用更少的空間而使用的,但那只是相對于unicode編碼來說,如果已經(jīng)知道是漢字,則使用GB2312/GBK無疑是最節(jié)省的。不過另一方面,值得說明的是,雖然utf編碼對漢字使用3個字節(jié),但即使對于漢字網(wǎng)頁,utf編碼也會比unicode編碼節(jié)省,因為網(wǎng)頁中包含了很多的英文字符。

    3.?java對字符的處理

    在java應(yīng)用軟件中,會有多處涉及到字符集編碼,有些地方需要進行正確的設(shè)置,有些地方需要進行一定程度的處理。

    3.1.?getBytes(charset)

    這是java字符串處理的一個標準函數(shù),其作用是將字符串所表示的字符按照charset編碼,并以字節(jié)方式表示。注意字符串在java內(nèi)存中總是按unicode編碼存儲的。比如"中文",正常情況下(即沒有錯誤的時候)存儲為"4e2d?6587",如果charset為"gbk",則被編碼為"d6d0?cec4",然后返回字節(jié)"d6?d0?ce?c4"。如果charset為"utf8"則最后是"e4?b8?ad?e6?96?87"。如果是"iso8859-1",則由于無法編碼,最后返回?"3f?3f"(兩個問號)。

    3.2.?new?String(charset)

    這是java字符串處理的另一個標準函數(shù),和上一個函數(shù)的作用相反,將字節(jié)數(shù)組按照charset編碼進行組合識別,最后轉(zhuǎn)換為unicode存儲。參考上述getBytes的例子,"gbk"?和"utf8"都可以得出正確的結(jié)果"4e2d?6587",但iso8859-1最后變成了"003f?003f"(兩個問號)。

    因為utf8可以用來表示/編碼所有字符,所以new?String(?str.getBytes(?"utf8"?),?"utf8"?)?===?str,即完全可逆。

    3.3.?setCharacterEncoding()

    該函數(shù)用來設(shè)置http請求或者相應(yīng)的編碼。

    對于request,是指提交內(nèi)容的編碼,指定后可以通過getParameter()則直接獲得正確的字符串,如果不指定,則默認使用iso8859-1編碼,需要進一步處理。參見下述"表單輸入"。值得注意的是在執(zhí)行setCharacterEncoding()之前,不能執(zhí)行任何getParameter()。java?doc上說明:This?method?must?be?called?prior?to?reading?request?parameters?or?reading?input?using?getReader()。而且,該指定只對POST方法有效,對GET方法無效。分析原因,應(yīng)該是在執(zhí)行第一個getParameter()的時候,java將會按照編碼分析所有的提交內(nèi)容,而后續(xù)的getParameter()不再進行分析,所以setCharacterEncoding()無效。而對于GET方法提交表單是,提交的內(nèi)容在URL中,一開始就已經(jīng)按照編碼分析所有的提交內(nèi)容,setCharacterEncoding()自然就無效。

    對于response,則是指定輸出內(nèi)容的編碼,同時,該設(shè)置會傳遞給瀏覽器,告訴瀏覽器輸出內(nèi)容所采用的編碼。

    3.4.?處理過程

    下面分析兩個有代表性的例子,說明java對編碼有關(guān)問題的處理方法。

    3.4.1.?表單輸入

    User?input?*(gbk:d6d0?cec4)?browser?*(gbk:d6d0?cec4)?web?server?iso8859-1(00d6?00d?000ce?00c4)?class,需要在class中進行處理:getbytes("iso8859-1")為d6?d0?ce?c4,new?String("gbk")為d6d0?cec4,內(nèi)存中以unicode編碼則為4e2d?6587。

    l?用戶輸入的編碼方式和頁面指定的編碼有關(guān),也和用戶的操作系統(tǒng)有關(guān),所以是不確定的,上例以gbk為例。

    l?從browser到web?server,可以在表單中指定提交內(nèi)容時使用的字符集,否則會使用頁面指定的編碼。而如果在url中直接用?的方式輸入?yún)?shù),則其編碼往往是操作系統(tǒng)本身的編碼,因為這時和頁面無關(guān)。上述仍舊以gbk編碼為例。

    l?Web?server接收到的是字節(jié)流,默認時(getParameter)會以iso8859-1編碼處理之,結(jié)果是不正確的,所以需要進行處理。但如果預(yù)先設(shè)置了編碼(通過request.?setCharacterEncoding?()),則能夠直接獲取到正確的結(jié)果。

    l?在頁面中指定編碼是個好習(xí)慣,否則可能失去控制,無法指定正確的編碼。

    3.4.2.?文件編譯

    假設(shè)文件是gbk編碼保存的,而編譯有兩種編碼選擇:gbk或者iso8859-1,前者是中文windows的默認編碼,后者是linux的默認編碼,當(dāng)然也可以在編譯時指定編碼。

    Jsp?*(gbk:d6d0?cec4)?java?file?*(gbk:d6d0?cec4)?compiler?read?uincode(gbk:?4e2d?6587;?iso8859-1:?00d6?00d?000ce?00c4)?compiler?write?utf(gbk:?e4b8ad?e69687;?iso8859-1:?*)?compiled?file?unicode(gbk:?4e2d?6587;?iso8859-1:?00d6?00d?000ce?00c4)?class。所以用gbk編碼保存,而用iso8859-1編譯的結(jié)果是不正確的。

    class?unicode(4e2d?6587)?system.out?/?jsp.out?gbk(d6d0?cec4)?os?console?/?browser。

    l?文件可以以多種編碼方式保存,中文windows下,默認為ansi/gbk。

    l?編譯器讀取文件時,需要得到文件的編碼,如果未指定,則使用系統(tǒng)默認編碼。一般class文件,是以系統(tǒng)默認編碼保存的,所以編譯不會出問題,但對于jsp文件,如果在中文windows下編輯保存,而部署在英文linux下運行/編譯,則會出現(xiàn)問題。所以需要在jsp文件中用pageEncoding指定編碼。

    l?Java編譯的時候會轉(zhuǎn)換成統(tǒng)一的unicode編碼處理,最后保存的時候再轉(zhuǎn)換為utf編碼。

    l?當(dāng)系統(tǒng)輸出字符的時候,會按指定編碼輸出,對于中文windows下,System.out將使用gbk編碼,而對于response(瀏覽器),則使用jsp文件頭指定的contentType,或者可以直接為response指定編碼。同時,會告訴browser網(wǎng)頁的編碼。如果未指定,則會使用iso8859-1編碼。對于中文,應(yīng)該為browser指定輸出字符串的編碼。

    l?browser顯示網(wǎng)頁的時候,首先使用response中指定的編碼(jsp文件頭指定的contentType最終也反映在response上),如果未指定,則會使用網(wǎng)頁中meta項指定中的contentType。

    3.5.?幾處設(shè)置

    對于web應(yīng)用程序,和編碼有關(guān)的設(shè)置或者函數(shù)如下。

    3.5.1.?jsp編譯

    指定文件的存儲編碼,很明顯,該設(shè)置應(yīng)該置于文件的開頭。例如:。另外,對于一般class文件,可以在編譯的時候指定編碼。

    3.5.2.?jsp輸出

    指定文件輸出到browser是使用的編碼,該設(shè)置也應(yīng)該置于文件的開頭。例如:。該設(shè)置和response.setCharacterEncoding("GBK")等效。

    3.5.3.?meta設(shè)置

    指定網(wǎng)頁使用的編碼,該設(shè)置對靜態(tài)網(wǎng)頁尤其有作用。因為靜態(tài)網(wǎng)頁無法采用jsp的設(shè)置,而且也無法執(zhí)行response.setCharacterEncoding()。例如:

    如果同時采用了jsp輸出和meta設(shè)置兩種編碼指定方式,則jsp指定的優(yōu)先。因為jsp指定的直接體現(xiàn)在response中。

    需要注意的是,apache有一個設(shè)置可以給無編碼指定的網(wǎng)頁指定編碼,該指定等同于jsp的編碼指定方式,所以會覆蓋靜態(tài)網(wǎng)頁中的meta指定。所以有人建議關(guān)閉該設(shè)置。

    3.5.4.?form設(shè)置

    當(dāng)瀏覽器提交表單的時候,可以指定相應(yīng)的編碼。例如:
    。一般不必不使用該設(shè)置,瀏覽器會直接使用網(wǎng)頁的編碼。

    4.?系統(tǒng)軟件

    下面討論幾個相關(guān)的系統(tǒng)軟件。

    4.1.?mysql數(shù)據(jù)庫

    很明顯,要支持多語言,應(yīng)該將數(shù)據(jù)庫的編碼設(shè)置成utf或者unicode,而utf更適合與存儲。但是,如果中文數(shù)據(jù)中包含的英文字母很少,其實unicode更為適合。

    數(shù)據(jù)庫的編碼可以通過mysql的配置文件設(shè)置,例如default-character-set=utf8。還可以在數(shù)據(jù)庫鏈接URL中設(shè)置,例如:?useUnicode=true&characterEncoding=UTF-8。注意這兩者應(yīng)該保持一致,在新的sql版本里,在數(shù)據(jù)庫鏈接URL里可以不進行設(shè)置,但也不能是錯誤的設(shè)置。

    4.2.?apache

    appache和編碼有關(guān)的配置在httpd.conf中,例如AddDefaultCharset?UTF-8。如前所述,該功能會將所有靜態(tài)頁面的編碼設(shè)置為UTF-8,最好關(guān)閉該功能。

    另外,apache還有單獨的模塊來處理網(wǎng)頁響應(yīng)頭,其中也可能對編碼進行設(shè)置。

    4.3.?linux默認編碼

    這里所說的linux默認編碼,是指運行時的環(huán)境變量。兩個重要的環(huán)境變量是LC_ALL和LANG,默認編碼會影響到j(luò)ava?URLEncode的行為,下面有描述。

    建議都設(shè)置為"zh_CN.UTF-8"。

    4.4.?其它

    為了支持中文文件名,linux在加載磁盤時應(yīng)該指定字符集,例如:mount?/dev/hda5?/mnt/hda5/?-t?ntfs?-o?iocharset=gb2312。

    另外,如前所述,使用GET方法提交的信息不支持request.setCharacterEncoding(),但可以通過tomcat的配置文件指定字符集,在tomcat的server.xml文件中,形如:。這種方法將統(tǒng)一設(shè)置所有請求,而不能針對具體頁面進行設(shè)置,也不一定和browser使用的編碼相同,所以有時候并不是所期望的。

    5.?URL地址

    URL地址中含有中文字符是很麻煩的,前面描述過使用GET方法提交表單的情況,使用GET方法時,參數(shù)就是包含在URL中。

    5.1.?URL編碼

    對于URL中的一些特殊字符,瀏覽器會自動進行編碼。這些字符除了"/?&"等外,還包括unicode字符,比如漢子。這時的編碼比較特殊。

    IE有一個選項"總是使用UTF-8發(fā)送URL",當(dāng)該選項有效時,IE將會對特殊字符進行UTF-8編碼,同時進行URL編碼。如果改選項無效,則使用默認編碼"GBK",并且不進行URL編碼。但是,對于URL后面的參數(shù),則總是不進行編碼,相當(dāng)于UTF-8選項無效。比如"中文.html?a=中文",當(dāng)UTF-8選項有效時,將發(fā)送鏈接"%e4%b8%ad%e6%96%87.html?a=x4ex2dx65x87";而UTF-8選項無效時,將發(fā)送鏈接"x4ex2dx65x87.html?a=x4ex2dx65x87"。注意后者前面的"中文"兩個字只有4個字節(jié),而前者卻有18個字節(jié),這主要時URL編碼的原因。

    當(dāng)web?server(tomcat)接收到該鏈接時,將會進行URL解碼,即去掉"%",同時按照ISO8859-1編碼(上面已經(jīng)描述,可以使用URLEncoding來設(shè)置成其它編碼)識別。上述例子的結(jié)果分別是"ue4ub8uadue6u96u87.html?a=u4eu2du65u87"和"u4eu2du65u87.html?a=u4eu2du65u87",注意前者前面的"中文"兩個字恢復(fù)成了6個字符。這里用"u",表示是unicode。

    所以,由于客戶端設(shè)置的不同,相同的鏈接,在服務(wù)器上得到了不同結(jié)果。這個問題不少人都遇到,卻沒有很好的解決辦法。所以有的網(wǎng)站會建議用戶嘗試關(guān)閉UTF-8選項。不過,下面會描述一個更好的處理辦法。

    5.2.?rewrite

    熟悉的人都知道,apache有一個功能強大的rewrite模塊,這里不描述其功能。需要說明的是該模塊會自動將URL解碼(去除%),即完成上述web?server(tomcat)的部分功能。有相關(guān)文檔介紹說可以使用[NE]參數(shù)來關(guān)閉該功能,但我試驗并未成功,可能是因為版本(我使用的是apache?2.0.54)問題。另外,當(dāng)參數(shù)中含有"?&?"等符號的時候,該功能將導(dǎo)致系統(tǒng)得不到正常結(jié)果。

    rewrite本身似乎完全是采用字節(jié)處理的方式,而不考慮字符串的編碼,所以不會帶來編碼問題。

    5.3.?URLEncode.encode()

    這是Java本身提供對的URL編碼函數(shù),完成的工作和上述UTF-8選項有效時瀏覽器所做的工作相似。值得說明的是,java已經(jīng)不贊成不指定編碼來使用該方法(deprecated)。應(yīng)該在使用的時候增加編碼指定。

    當(dāng)不指定編碼的時候,該方法使用系統(tǒng)默認編碼,這會導(dǎo)致軟件運行結(jié)果得不確定。比如對于"中文",當(dāng)系統(tǒng)默認編碼為"gb2312"時,結(jié)果是"%4e%2d%65%87",而默認編碼為"UTF-8",結(jié)果卻是"%e4%b8%ad%e6%96%87",后續(xù)程序?qū)㈦y以處理。另外,這兒說的系統(tǒng)默認編碼是由運行tomcat時的環(huán)境變量LC_ALL和LANG等決定的,曾經(jīng)出現(xiàn)過tomcat重啟后就出現(xiàn)亂碼的問題,最后才郁悶的發(fā)現(xiàn)是因為修改修改了這兩個環(huán)境變量。

    建議統(tǒng)一指定為"UTF-8"編碼,可能需要修改相應(yīng)的程序。

    5.4.?一個解決方案

    上面說起過,因為瀏覽器設(shè)置的不同,對于同一個鏈接,web?server收到的是不同內(nèi)容,而軟件系統(tǒng)有無法知道這中間的區(qū)別,所以這一協(xié)議目前還存在缺陷。

    針對具體問題,不應(yīng)該僥幸認為所有客戶的IE設(shè)置都是UTF-8有效的,也不應(yīng)該粗暴的建議用戶修改IE設(shè)置,要知道,用戶不可能去記住每一個web?server的設(shè)置。所以,接下來的解決辦法就只能是讓自己的程序多一點智能:根據(jù)內(nèi)容來分析編碼是否UTF-8。

    比較幸運的是UTF-8編碼相當(dāng)有規(guī)律,所以可以通過分析傳輸過來的鏈接內(nèi)容,來判斷是否是正確的UTF-8字符,如果是,則以UTF-8處理之,如果不是,則使用客戶默認編碼(比如"GBK"),下面是一個判斷是否UTF-8的例子,如果你了解相應(yīng)規(guī)律,就容易理解。

    public?static?boolean?isValidUtf8(byte[]?b,int?aMaxCount){

    int?lLen=b.length,lCharCount=0;

    for(int?i=0;i?
    byte?lByte=b[i++];//to?fast?operation,?++?now,?ready?for?the?following?for(;;)

    if(lByte>=0)?continue;//>=0?is?normal?ascii

    if(lByte<(byte)0xc0?||?lByte>(byte)0xfd)?return?false;

    int?lCount=lByte>(byte)0xfc?5:lByte>(byte)0xf8?4

    :lByte>(byte)0xf0?3:lByte>(byte)0xe0?2:1;

    if(i+lCount>lLen)?return?false;

    for(int?j=0;j=(byte)0xc0)?return?false;

    }

    return?true;

    }

    相應(yīng)地,一個使用上述方法的例子如下:

    public?static?String?getUrlParam(String?aStr,String?aDefaultCharset)

    throws?UnsupportedEncodingException{

    if(aStr==null)?return?null;

    byte[]?lBytes=aStr.getBytes("ISO-8859-1");

    return?new?String(lBytes,StringUtil.isValidUtf8(lBytes)?"utf8":aDefaultCharset);

    }

    不過,該方法也存在缺陷,如下兩方面:

    l?沒有包括對用戶默認編碼的識別,這可以根據(jù)請求信息的語言來判斷,但不一定正確,因為我們有時候也會輸入一些韓文,或者其他文字。

    l?可能會錯誤判斷UTF-8字符,一個例子是"學(xué)習(xí)"兩個字,其GBK編碼是"?xd1xa7xcfxb0",如果使用上述isValidUtf8方法判斷,將返回true。可以考慮使用更嚴格的判斷方法,不過估計效果不大。

    有一個例子可以證明google也遇到了上述問題,而且也采用了和上述相似的處理方法,比如,如果在地址欄中輸入"http://www.google.com/search?hl=zh-CN&newwindow=1&q=學(xué)習(xí)",google將無法正確識別,而其他漢字一般能夠正常識別。

    最后,應(yīng)該補充說明一下,如果不使用rewrite規(guī)則,或者通過表單提交數(shù)據(jù),其實并不一定會遇到上述問題,因為這時可以在提交數(shù)據(jù)時指定希望的編碼。另外,中文文件名確實會帶來問題,應(yīng)該謹慎使用。

    6.?其它

    下面描述一些和編碼有關(guān)的其他問題。

    6.1.?SecureCRT

    除了瀏覽器和控制臺與編碼有關(guān)外,一些客戶端也很有關(guān)系。比如在使用SecureCRT連接linux時,應(yīng)該讓SecureCRT的顯示編碼(不同的session,可以有不同的編碼設(shè)置)和linux的編碼環(huán)境變量保持一致。否則看到的一些幫助信息,就可能是亂碼。

    另外,mysql有自己的編碼設(shè)置,也應(yīng)該保持和SecureCRT的顯示編碼一致。否則通過SecureCRT執(zhí)行sql語句的時候,可能無法處理中文字符,查詢結(jié)果也會出現(xiàn)亂碼。

    對于Utf-8文件,很多編輯器(比如記事本)會在文件開頭增加三個不可見的標志字節(jié),如果作為mysql的輸入文件,則必須要去掉這三個字符。(用linux的vi保存可以去掉這三個字符)。一個有趣的現(xiàn)象是,在中文windows下,創(chuàng)建一個新txt文件,用記事本打開,輸入"連通"兩個字,保存,再打開,你會發(fā)現(xiàn)兩個字沒了,只留下一個小黑點。

    6.2.?過濾器

    如果需要統(tǒng)一設(shè)置編碼,則通過filter進行設(shè)置是個不錯的選擇。在filter?class中,可以統(tǒng)一為需要的請求或者回應(yīng)設(shè)置編碼。參加上述setCharacterEncoding()。這個類apache已經(jīng)給出了可以直接使用的例子SetCharacterEncodingFilter。

    6.3.?POST和GET

    很明顯,以POST提交信息時,URL有更好的可讀性,而且可以方便的使用setCharacterEncoding()來處理字符集問題。但GET方法形成的URL能夠更容易表達網(wǎng)頁的實際內(nèi)容,也能夠用于收藏。

    從統(tǒng)一的角度考慮問題,建議采用GET方法,這要求在程序中獲得參數(shù)是進行特殊處理,而無法使用setCharacterEncoding()的便利,如果不考慮rewrite,就不存在IE的UTF-8問題,可以考慮通過設(shè)置URIEncoding來方便獲取URL中的參數(shù)。

    6.4.?簡繁體編碼轉(zhuǎn)換

    GBK同時包含簡體和繁體編碼,也就是說同一個字,由于編碼不同,在GBK編碼下屬于兩個字。有時候,為了正確取得完整的結(jié)果,應(yīng)該將繁體和簡體進行統(tǒng)一。可以考慮將UTF、GBK中的所有繁體字,轉(zhuǎn)換為相應(yīng)的簡體字,BIG5編碼的數(shù)據(jù),也應(yīng)該轉(zhuǎn)化成相應(yīng)的簡體字。當(dāng)然,仍舊以UTF編碼存儲。

    例如,對于"語言??言",用UTF表示為"xE8xAFxADxE8xA8x80?xE8xAAx9ExE8xA8x80",進行簡繁體編碼轉(zhuǎn)換后應(yīng)該是兩個相同的?"xE8xAFxADxE8xA8x80>"。?
    posted on 2007-01-19 14:31 happytian 閱讀(242) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    <2007年1月>
    31123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    Welcome here, my friend!

    常用鏈接

    留言簿(12)

    隨筆檔案(66)

    文章分類

    文章檔案(63)

    web

    最新隨筆

    搜索

    •  

    積分與排名

    • 積分 - 89137
    • 排名 - 647

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 中文字幕免费在线看线人| 男女一进一出抽搐免费视频| 99久9在线|免费| 国产亚洲综合色就色| 成人免费无码H在线观看不卡| 免费一级e一片在线播放| 美女免费视频一区二区三区| 亚洲自偷自偷精品| 精品国产污污免费网站 | 午夜免费福利视频| 久久久久亚洲av无码专区| 91精品全国免费观看含羞草| 亚洲国产精品不卡在线电影| 老汉精品免费AV在线播放| 亚洲国产成a人v在线| 在线免费不卡视频| 草久免费在线观看网站| 亚洲午夜久久久久妓女影院| 精品国产免费一区二区三区香蕉 | 精品亚洲成α人无码成α在线观看| 黄色免费在线观看网址| 国产偷窥女洗浴在线观看亚洲 | 一级做性色a爰片久久毛片免费| 久久精品国产亚洲AV不卡| 国产自国产自愉自愉免费24区 | 中国xxxxx高清免费看视频| 国产.亚洲.欧洲在线| 国产小视频在线免费| 久久成人永久免费播放| 亚洲精品国产成人专区| 成人毛片18女人毛片免费视频未| 婷婷亚洲综合五月天小说| 亚洲免费闲人蜜桃| 亚洲爆乳成av人在线视菜奈实| 亚洲精品网站在线观看不卡无广告 | 亚洲黄色片免费看| 成人永久免费高清| 任你躁在线精品免费| 亚洲一区中文字幕在线观看| 亚洲第一区精品日韩在线播放| 免费成人在线电影|