青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

唐吉訶德

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  5 Posts :: 75 Stories :: 3 Comments :: 0 Trackbacks

常用鏈接

留言簿(2)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

字符是各種文字和符號的總稱,包括各國家文字、標點符號、圖形符號、數字等。字符集是多個字符的集合,字符集種類較多,每個字符集包含的字符個數不同,常見字符集名稱:ASCII字符集、GB2312字符集、BIG5字符集、 GB 18030字符集、Unicode字符集等。計算機要準確的處理各種字符集文字,需要進行字符編碼,以便計算機能夠識別和存儲各種文字。

中文文字數目大,而且還分為簡體中文和繁體中文兩種不同書寫規則的文字,而計算機最初是按英語單字節字符設計的,因此,對中文字符進行編碼,是中文信息交流的技術基礎。本文將按照字符集的時間順序討論幾種典型的字符集,選取幾種代表性的中文字符集,研究歷史由來、特點、技術特征。

 

漢字編碼范圍

名稱 第一字節 第二字節

GB2312 0xB0-0xF7(176-247)    0xA0-0xFE(160-254)

GBK 0x81-0xFE(129-254)     0x40-0xFE(64-254)

Big5 0x81-0xFE(129-255)     0x40-0x7E(64-126)

0xA1-0xFE(161-254)

 

ASCII 字符集

1.名稱的由來

ASCII(American Standard Code for Information Interchange,美國信息互換標準代碼)是基于羅馬字母表的一套電腦編碼系統。

2.特點

它主要用于顯示現代英語和其他西歐語言。它是現今最通用的單字節編碼系統,并等同于國際標準ISO 646。

3.包含內容

控制字符:回車鍵、退格、換行鍵等。

可顯示字符:英文大小寫字符、阿拉伯數字和西文符號

4.技術特征

7位(bits)表示一個字符,共128字符

5.ASCII擴展字符集

7位編碼的字符集只能支持128個字符,為了表示更多的歐洲常用字符對ASCII進行了擴展,ASCII擴展字符集使用8位(bits)表示一個字符,共256字符。

ASCII擴展字符集比ASCII字符集擴充出來的符號包括表格符號、計算符號、希臘字母和特殊的拉丁符號。

 

GB2312 字符集

 1.名稱的由來

GB2312又稱為GB2312-80字符集,全稱為《信息交換用漢字編碼字符集·基本集》,由原中國國家標準總局發布,1981年5月1日實施。

2.特點

GB2312是中國國家標準的簡體中文字符集。它所收錄的漢字已經覆蓋99.75%的使用頻率,基本滿足了漢字的計算機處理需要。在中國大陸和新加坡獲廣泛使用。

3.包含內容

GB2312收錄簡化漢字及一般符號、序號、數字、拉丁字母、日文假名、希臘字母、俄文字母、漢語拼音符號、漢語注音字母,共 7445 個圖形字符。其中包括6763個漢字,其中一級漢字3755個,二級漢字3008個;包括拉丁字母、希臘字母、日文平假名及片假名字母、俄語西里爾字母在內的682個全角字符。

4.技術特征

(1)分區表示:

GB2312中對所收漢字進行了“分區”處理,每區含有94個漢字/符號。這種表示方式也稱為區位碼。

各區包含的字符如下:01-09區為特殊符號;16-55區為一級漢字,按拼音排序;56-87區為二級漢字,按部首/筆畫排序;10-15區及88-94區則未有編碼。

(2)雙字節表示

兩個字節中前面的字節為第一字節,后面的字節為第二字節。習慣上稱第一字節為“高字節” ,而稱第二字節為“低字節”。

“高位字節”使用了0xA1-0xF7 (把01-87區(88-94區未有編碼)的區號加上0xA0),“低位字節”使用了0xA1-0xFE (把01-94加上0xA0)。

    GB2312又稱國標碼,由國家標準總局發布,198151日實施,通行于大陸。新加坡等地也使用此編碼。它是一個簡化字的編碼規范,當然也包括其他的符號、字母、日文假名等,共7445個圖形字符,其中漢字占6763個。我們平時說6768個漢字,實際上里邊有5個編碼為空白,所以總共有6763個漢字。

      GB2312規定“對任意一個圖形字符都采用兩個字節表示,每個字節均采用七位編碼表示”,習慣上稱第一個字節為“高字節”,第二個字節為“低字節”。GB2312中漢字的編碼范圍為,第一字節0xB0-0xF7(對應十進制為176-247),第二個字節0xA0-0xFE(對應十進制為160-254)。

    GB2312將代碼表分為94個區,對應第一字節(0xa1-0xfe);每個區94個位(0xa1-0xfe),對應第二字節,兩個字節的值分別為區號值和位號值加322OH),因此也稱為區位碼。01-09區為符號、數字區,16-87區為漢字區(0xb0-0xf7),10-15區、88-94區是有待進一步標準化的空白區。

5.編碼舉例

以GB2312字符集的第一個漢字“啊”字為例,它的區號16,位號01,則區位碼是1601,在大多數計算機程序中,高字節和低字節分別加0xA0得到程序的漢字處理編碼0xB0A1。計算公式是:0xB0=0xA0+16, 0xA1=0xA0+1。“北京”的區位碼分別是:17 17 30 09 所以分別加上0xA0 0xA0 0xA0 0xA0,在內存中顯示的16進制是 B1 B1 BE A9

 

GBK 字符集

1.名稱的由來

GBK是GB2312的擴展,是向上兼容的,因此GB2312中的漢字的編碼與GBK中漢字的相同。另外,GBK中還包含繁體字的編碼,它與Big5編碼之間的關系我還沒有弄明白,好像是不一致的。

2. 特點

GBK中每個漢字仍然包含兩個字節,第一個字節的范圍是0x81-0xFE(即129-254),第二個字節的范圍是0x40-0xFE(即64-254)。GBK中有碼位23940個,包含漢字21003個。

BIG5 字符集

1.名稱的由來

又稱大五碼或五大碼,1984年由臺灣財團法人信息工業策進會和五間軟件公司宏碁 (Acer)、神通 (MiTAC)、佳佳、零壹 (Zero One)、大眾 (FIC)創立,故稱大五碼。

Big5碼的產生,是因為當時臺灣不同廠商各自推出不同的編碼,如倚天碼、IBM PS55、王安碼等,彼此不能兼容;另一方面,臺灣政府當時尚未推出官方的漢字編碼,而中國大陸的GB2312編碼亦未有收錄繁體中文字。

2.特點

Big5字符集共收錄13,053個中文字,該字符集在中國臺灣使用。耐人尋味的是該字符集重復地收錄了兩個相同的字:“兀”(0xA461及0xC94A)、“嗀”(0xDCD1及0xDDFC)。

3.字符編碼方法

Big5碼使用了雙字節儲存方法,以兩個字節來編碼一個字。第一個字節稱為“高位字節”,第二個字節稱為“低位字節”。高位字節的編碼范圍0xA1-0xF9,低位字節的編碼范圍0x40-0x7E及0xA1-0xFE。

各編碼范圍對應的字符類型如下:0xA140-0xA3BF為標點符號、希臘字母及特殊符號,另外于0xA259-0xA261,存放了雙音節度量衡單位用字:兙兛兞兝兡兣嗧瓩糎;0xA440-0xC67E為常用漢字,先按筆劃再按部首排序;0xC940-0xF9D5為次常用漢字,亦是先按筆劃再按部首排序。

4.Big5 的局限性

盡管Big5碼內包含一萬多個字符,但是沒有考慮社會上流通的人名、地名用字、方言用字、化學及生物科等用字,沒有包含日文平假名及片假名字母。

例如臺灣視“著”為“著”的異體字,故沒有收錄“著”字。康熙字典中的一些部首用字(如“亠”、“疒”、“辵”、“癶”等)、常見的人名用字(如“堃”、“煊”、“栢”、“喆”等) 也沒有收錄到Big5之中。

 

GB18030 字符集

1.名稱的由來

GB 18030的全稱是GB18030-2000《信息交換用漢字編碼字符集基本集的擴充》,是我國政府于2000年3月17日發布的新的漢字編碼國家標準,2001年8月31日后在中國市場上發布的軟件必須符合本標準

2.特點

GB 18030字符集標準的出臺經過廣泛參與和論證,來自國內外知名信息技術行業的公司,信息產業部和原國家質量技術監督局聯合實施。

GB 18030字符集標準解決漢字、日文假名、朝鮮語和中國少數民族文字組成的大字符集計算機編碼問題。該標準的字符總編碼空間超過150萬個編碼位,收錄了27484個漢字,覆蓋中文、日文、朝鮮語和中國少數民族文字。滿足中國大陸、香港、臺灣、日本和韓國等東亞地區信息交換多文種、大字量、多用途、統一編碼格式的要求。并且與Unicode 3.0版本兼容,填補Unicode擴展字符字匯“統一漢字擴展A”的內容。并且與以前的國家字符編碼標準(GB2312,GB13000.1)兼容。

3.編碼方法

GB 18030標準采用單字節、雙字節和四字節三種方式對字符編碼。單字節部分使用0×00至0×7F碼(對應于ASCII碼的相應碼)。雙字節部分,首字節碼從0×81至0×FE,尾字節碼位分別是0×40至0×7E和0×80至0×FE。四字節部分采用GB/T 11383未采用的0×30到0×39作為對雙字節編碼擴充的后綴,這樣擴充的四字節編碼,其范圍為0×81308130到0×FE39FE39。其中第一、三個字節編碼碼位均為0×81至0×FE,第二、四個字節編碼碼位均為0×30至0×39。

4.包含的內容

雙字節部分收錄內容主要包括GB13000.1全部CJK漢字20902個、有關標點符號、表意文字描述符13個、增補的漢字和部首/構件80個、雙字節編碼的歐元符號等。  四字節部分收錄了上述雙字節字符之外的,包括CJK統一漢字擴充A在內的GB 13000.1中的全部字符。

 

對漢字進行hash

    為了處理漢字的方便,在查找漢字的時候,我們通常會用到hash的方法,那怎么來確定一個漢字位置呢?這就和每種編碼的排列有關了,這里主要給出一種hash函數的策略。

    對于GB2312編碼,設輸入的漢字為GBword,我們可以采用公式(C1-176)*94 + (C2-161)確定GBindex。其中,C1表示第一字節,C2表示第二字節。具體如下:

    GBindex = ((unsigned char)GBword.at(0)-176)*94 + (unsigned char)GBword.at(1) - 161;

    之所以用unsigned char類型,是因為char是一個字節,如果用unsigend int,因為int是4個字節的,所以會造成擴展,導致錯誤。

       對于GBK編碼,設輸入的漢字為GBKword,則可以采用公式   index=(ch1-0x81)*190+(ch2-0x40)-(ch2/128),其中ch1是第一字節,ch2是第二字節。

    具體的,

    GBKindex = ((unsigned char)GBKword[0]-129)*190 +

               ((unsigned char)GBKword[1]-64) - (unsigned char)GBKword[1]/128;

 

怎樣判斷一個漢字的是什么編碼

直接根據漢字的編碼范圍判斷,對于GB2312和GBK可用下面兩個程序實現。

1、判斷是否是GB2312

bool isGBCode(const string& strIn)

{

    unsigned char ch1;

    unsigned char ch2;

   

    if (strIn.size() >= 2)

    {

        ch1 = (unsigned char)strIn.at(0);

        ch2 = (unsigned char)strIn.at(1);

        if (ch1>=176 && ch1<=247 && ch2>=160 && ch2<=254)

            return true;

        else return false;

    }

    else return false;

}

2、判斷是否是GBK編碼

bool isGBKCode(const string& strIn)

{

    unsigned char ch1;

    unsigned char ch2;

   

    if (strIn.size() >= 2)

    {

        ch1 = (unsigned char)strIn.at(0);

        ch2 = (unsigned char)strIn.at(1);

        if (ch1>=129 && ch1<=254 && ch2>=64 && ch2<=254)

            return true;

        else return false;

    }

    else return false;

}

 

3、對于Big5

    它的范圍為:高字節從0xA0到0xFE,低字節從0x40到0x7E,和0xA1到0xFE兩部分。判斷一個漢字是否是BIG5編碼,可以如上對字符的編碼范圍判斷即可。如何定位呢?那么也想象所有編碼排列為一個二維坐標,縱坐標是高字節,橫坐標是低字節。這樣一行上的漢字個數:(0x7E-0x40+1)+(0xFE-0xA1+1)=157。那么定位算法分兩塊,為: 

    if 0x40<=ch2<=0x7E: #is big5 char

    index=((ch1-0xA1)*157+(ch2-0x40))*2

    elif 0xA1<=ch2<=0xFE: #is big5 char

    index=((ch1-0xA1)*157+(ch2-0xA1+63))*2

 

對于第二塊,計算偏移量時因為有兩塊數值,所以在計算后面一段值時,不要忘了前面還有一段值。0x7E-0x40+1=63。

 

如果判斷一個字符是西文字符還是中文字符

    大家知道西文字符主要是指ASCII碼,它用一個字節表示。且這個字符轉換成數字之后,該數字是大于0的,而漢字是兩個字節的,第一個字節的轉化為數字之后應該是小于0的,因此可以根據每個字節轉化為數字之后是否小于0,判斷它是否是漢字。

    例如,設輸入字為strin,則,

     If (strin.at(0) < 0)

       cout << ”是漢字” << endl;

     else cout << ”不是漢字” << endl;

 

編碼表

 

 

Unicode字符集

1.名稱的由來

Unicode字符集編碼是Universal Multiple-Octet Coded Character Set 通用多八位編碼字符集的簡稱,是由一個名為 Unicode 學術學會(Unicode Consortium)的機構制訂的字符編碼系統,支持現今世界各種不同語言的書面文本的交換、處理及顯示。該編碼于1990年開始研發,1994年正式公布,最新版本是2005年3月31日的Unicode 4.1.0。

2.特征

Unicode是一種在計算機上使用的字符編碼。它為每種語言中的每個字符設定了統一并且唯一的二進制編碼,以滿足跨語言、跨平臺進行文本轉換、處理的要求。

3.編碼方法

Unicode 標準始終使用十六進制數字,而且在書寫時在前面加上前綴“U+”,例如字母“A”的編碼為 004116 和字符“?”的編碼為 20AC16。所以“A”的編碼書寫為“U+0041”。

4.UTF-8 編碼

UTF-8是Unicode的其中一個使用方式。 UTF是 Unicode Translation Format,即把Unicode轉做某種格式的意思。

UTF-8便于不同的計算機之間使用網絡傳輸不同語言和編碼的文字,使得雙字節的Unicode能夠在現存的處理單字節的系統上正確傳輸。

UTF-8使用可變長度字節來儲存 Unicode字符,例如ASCII字母繼續使用1字節儲存,重音文字、希臘字母或西里爾字母等使用2字節來儲存,而常用的漢字就要使用3字節。輔助平面字符則使用4字節。

5.UTF-16 和 UTF-32 編碼

UTF-32、UTF-16 和 UTF-8 是 Unicode 標準的編碼字符集的字符編碼方案,UTF-16 使用一個或兩個未分配的 16 位代碼單元的序列對 Unicode 代碼點進行編碼;UTF-32 即將每一個 Unicode 代碼點表示為相同值的 32 位整數

Ansi、Unicode、UTF8字符串之間的轉換和寫入文本文件


Ansi字符串我們最熟悉,英文占一個字節,漢字2個字節,以一個\0結尾,常用于txt文本文件
Unicode 字符串,每個字符(漢字、英文字母)都占2個字節,以2個連續的\0結尾,NT操作系統內核用的是這種字符串,常被定義為typedef unsigned short wchar_t;所以我們有時常會見到什么char*無法轉換為unsigned short*之類的錯誤,其實就是unicode
UTF8是Unicode一種壓縮形式,英文A在unicode中表示為0x0041,老外覺得這種存儲方式太浪費,因為浪費了50%的空間,于是就把英文壓縮成1個字節,成了utf8編碼,但是漢字在utf8中占3個字節,顯然用做中文不如 ansi合算,這就是中國的網頁用作ansi編碼而老外的網頁常用utf8的原因。
UTF8在還游戲里運用的很廣泛,比如WOW的lua腳本等

下面來說一下轉換,主要用代碼來說明吧
寫文件我用了CFile類,其實用FILE*之類的也是一樣,寫文件和字符串什么類別沒有關系,硬件只關心數據和長度
bool IsUTF8(const void* pBuffer, long size)  
{  
    bool IsUTF8 = true;  
    unsigned char* start = (unsigned char*)pBuffer;  
    unsigned char* end = (unsigned char*)pBuffer + size;  
    while (start < end)  
    {  
        if (*start < 0x80) // (10000000): 值小于0x80的為ASCII字符  
        {  
            start++;  
        }  
        else if (*start < (0xC0)) // (11000000): 值介于0x80與0xC0之間的為無效UTF-8字符  
        {  
            IsUTF8 = false;  
            break;  
        }  
        else if (*start < (0xE0)) // (11100000): 此范圍內為2字節UTF-8字符  
        {  
            if (start >= end - 1)   
                break;  
            if ((start[1] & (0xC0)) != 0x80)  
            {  
                IsUTF8 = false;  
                break;  
            }  
            start += 2;  
        }   
        else if (*start < (0xF0)) // (11110000): 此范圍內為3字節UTF-8字符  
        {  
            if (start >= end - 2)   
                break;  
            if ((start[1] & (0xC0)) != 0x80 || (start[2] & (0xC0)) != 0x80)  
            {  
                IsUTF8 = false;  
                break;  
            }  
            start += 3;  
        }   
        else 
        {  
            IsUTF8 = false;  
            break;  
        }  
    }  
    return IsUTF8;  


Ansi轉Unicode
介紹2種方法

void CConvertDlg::OnBnClickedButtonAnsiToUnicode()
{
    
// ansi to unicode

    char* szAnsi = "abcd1234你我他";
    
//預轉換,得到所需空間的大小

    int wcsLen = ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), NULL, 0);
    
//分配空間要給'\0'留個空間,MultiByteToWideChar不會給'\0'空間

    wchar_t* wszString = new wchar_t[wcsLen + 1];
    
//轉換

    ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), wszString, wcsLen);
    
//最后加上'\0'

    wszString[wcsLen] = '\0';
    
//unicode版的MessageBox API

    ::MessageBoxW(GetSafeHwnd(), wszString, wszString, MB_OK);

    
//
接下來寫入文本
    
//寫文本文件,頭2個字節0xfeff,低位0xff寫在前

    CFile cFile;
    cFile.Open(_T(
"1.txt"), CFile::modeWrite |
 CFile::modeCreate);
    
//文件開頭

    cFile.SeekToBegin();
    cFile.Write(
"\xff\xfe"2
);
    
//寫入內容

    cFile.Write(wszString, wcsLen * sizeof(wchar_t));
    cFile.Flush();
    cFile.Close();
    delete[] wszString;
    wszString 
=
NULL;


    
//
方法2
    
//
設置當前地域信息,不設置的話,使用這種方法,中文不會正確顯示
    
//需要#include<locale.h>

    setlocale(LC_CTYPE, "chs"); 
    wchar_t wcsStr[
100
];
    
//
注意下面是大寫S,在unicode中,代表后面是ansi字符串
    
//
swprintf是sprintf的unicode版本
    
//格式的前面要加大寫L,代表是unicode

    swprintf(wcsStr, L"%S", szAnsi);
    ::MessageBoxW(GetSafeHwnd(), wcsStr, wcsStr, MB_OK);

}



Unicode轉Ansi
也是2種方法

void CConvertDlg::OnBnClickedButtonUnicodeToAnsi()
{
    
// unicode to ansi

    wchar_t* wszString = L"abcd1234你我他";
    
//預轉換,得到所需空間的大小,這次用的函數和上面名字相反

    int ansiLen = ::WideCharToMultiByte(CP_ACP, NULL, wszString, wcslen(wszString), NULL, 0, NULL, NULL);
    
//同上,分配空間要給'\0'留個空間

    char* szAnsi = new char[ansiLen + 1];
    
//
轉換
    
//unicode版對應的strlen是wcslen

    ::WideCharToMultiByte(CP_ACP, NULL, wszString, wcslen(wszString), szAnsi, ansiLen, NULL, NULL);
    
//最后加上'\0'

    szAnsi[ansiLen] = '\0';
    
//Ansi版的MessageBox API

    ::MessageBoxA(GetSafeHwnd(), szAnsi, szAnsi, MB_OK);

    
//
接下來寫入文本
    
//寫文本文件,ANSI文件沒有BOM

    CFile cFile;
    cFile.Open(_T(
"1.txt"), CFile::modeWrite |
 CFile::modeCreate);
    
//文件開頭

    cFile.SeekToBegin();
    
//寫入內容

    cFile.Write(szAnsi, ansiLen * sizeof(char));
    cFile.Flush();
    cFile.Close();
    delete[] szAnsi;
    szAnsi 
=
NULL;


    
//
方法2
    
//和上面一樣有另一種方法

    setlocale(LC_CTYPE, "chs"); 
    
char szStr[100
];
    
//
注意下面是大寫,在ansi中,代表后面是unicode字符串
    
//sprintf

    sprintf(szStr, "%S", wszString);
    ::MessageBoxA(GetSafeHwnd(), szStr, szStr, MB_OK);
}



Unicode轉UTF8

void CConvertDlg::OnBnClickedButtonUnicodeToU8()
{
    
// unicode to UTF8

    wchar_t* wszString = L"abcd1234你我他";
    
//預轉換,得到所需空間的大小,這次用的函數和上面名字相反

    int u8Len = ::WideCharToMultiByte(CP_UTF8, NULL, wszString, wcslen(wszString), NULL, 0, NULL, NULL);
    
//
同上,分配空間要給'\0'留個空間
    
//UTF8雖然是Unicode的壓縮形式,但也是多字節字符串,所以可以以char的形式保存

    char* szU8 = new char[u8Len + 1];
    
//
轉換
    
//unicode版對應的strlen是wcslen

    ::WideCharToMultiByte(CP_UTF8, NULL, wszString, wcslen(wszString), szU8, u8Len, NULL, NULL);
    
//最后加上'\0'

    szU8[u8Len] = '\0';
    
//
MessageBox不支持UTF8,所以只能寫文件

    
//
接下來寫入文本
    
//寫文本文件,UTF8的BOM是0xbfbbef

    CFile cFile;
    cFile.Open(_T(
"1.txt"), CFile::modeWrite |
 CFile::modeCreate);
    
//文件開頭

    cFile.SeekToBegin();
    
//寫BOM,同樣低位寫在前

    cFile.Write("\xef\xbb\xbf"3);
    
//寫入內容

    cFile.Write(szU8, u8Len * sizeof(char));
    cFile.Flush();
    cFile.Close();
    delete[] szU8;
    szU8 
=
NULL;

}


UTF8轉UNICODE

void CConvertDlg::OnBnClickedButtonU8ToUnicode()
{
    
//
UTF8 to Unicode
    
//由于中文直接復制過來會成亂碼,編譯器有時會報錯,故采用16進制形式

    char* szU8 = "abcd1234\xe4\xbd\xa0\xe6\x88\x91\xe4\xbb\x96\x00";
    
//預轉換,得到所需空間的大小

    int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), NULL, 0);
    
//分配空間要給'\0'留個空間,MultiByteToWideChar不會給'\0'空間

    wchar_t* wszString = new wchar_t[wcsLen + 1];
    
//轉換

    ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), wszString, wcsLen);
    
//最后加上'\0'

    wszString[wcsLen] = '\0';
    
//unicode版的MessageBox API

    ::MessageBoxW(GetSafeHwnd(), wszString, wszString, MB_OK);

    
//寫文本同ansi to unicode

}

posted on 2010-10-08 16:15 心羽 閱讀(948) 評論(0)  編輯 收藏 引用 所屬分類: 編碼

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美在线欧美在线| 美女91精品| 亚洲免费高清视频| 亚洲一区二区三区中文字幕| 欧美一区1区三区3区公司| 美女日韩在线中文字幕| 一本到12不卡视频在线dvd| 久久久久欧美| 国产精品美女一区二区| 欧美日韩一级片在线观看| 亚洲国产精品久久久久秋霞蜜臀 | 一区二区三区产品免费精品久久75| 亚洲一级片在线看| 国产精品外国| 国产精品日韩一区二区三区| 亚洲美女av黄| 免费亚洲婷婷| 久久嫩草精品久久久久| 国产精品视频你懂的| 午夜在线观看欧美| 夜夜嗨av一区二区三区四区| 亚洲先锋成人| 另类成人小视频在线| 免费日韩精品中文字幕视频在线| 亚洲国产成人在线| 久久综合一区二区| 狂野欧美一区| 在线观看日韩国产| 午夜精品在线观看| 亚洲欧美春色| 国产精品久久久久秋霞鲁丝| 欧美夜福利tv在线| 亚洲欧美精品中文字幕在线| 国产日韩精品电影| 久久精品日韩| 久久国产精品免费一区| 亚洲福利一区| 欧美激情一区二区| 欧美日韩一区在线观看| 亚洲一区二区日本| 亚洲网站在线播放| 国产精品一区在线观看你懂的| 亚洲福利视频一区| 亚洲精品中文字幕在线观看| 欧美麻豆久久久久久中文| 亚洲中午字幕| 亚洲自拍偷拍网址| 在线观看视频一区二区| 欧美成人中文| 欧美金8天国| 欧美一区二区视频在线| 亚洲制服av| 亚洲国产精品精华液2区45| 欧美成人中文| 国产美女搞久久| 久久夜色精品一区| 欧美成人国产va精品日本一级| 亚洲一区二区三区高清| 亚洲欧美日韩精品久久亚洲区 | 一本到12不卡视频在线dvd| 亚洲精品一区二区三区福利| 国产亚洲成av人片在线观看桃| 久久欧美中文字幕| 欧美第一黄色网| 久久久久久久91| 欧美成人免费小视频| 久久精品毛片| 欧美久色视频| 久久国产精品久久久久久久久久| 欧美不卡视频一区| 国产午夜精品在线观看| 亚洲日韩欧美一区二区在线| 国产精品成人免费| 欧美成人精品三级在线观看| 麻豆久久精品| 午夜精品久久久久久久99水蜜桃| 欧美成人午夜剧场免费观看| 亚洲欧美日韩在线不卡| 欧美精品日韩www.p站| 久久av二区| 久久精品国产亚洲一区二区三区 | 欧美小视频在线| 一区二区三区久久久| 久久综合色88| 欧美一区二区三区日韩视频| 欧美日韩伊人| 欧美刺激午夜性久久久久久久| 国产伪娘ts一区| 亚洲美女视频在线观看| 国产字幕视频一区二区| 亚洲女ⅴideoshd黑人| 99re热这里只有精品免费视频| 久热精品在线| 久久亚洲私人国产精品va| 国产日产精品一区二区三区四区的观看方式 | 午夜久久久久| 欧美日产国产成人免费图片| 亚洲欧洲综合另类| 激情亚洲网站| 久久手机免费观看| 久久福利视频导航| 国产午夜精品在线| 亚洲小说春色综合另类电影| 国产原创一区二区| 久久久精品国产一区二区三区 | 欧美伦理一区二区| 99视频有精品| 夜夜嗨av一区二区三区网站四季av| 欧美刺激午夜性久久久久久久| 久久视频一区二区| 国产亚洲欧美一区在线观看| 欧美在线视频不卡| 欧美一区免费| 一色屋精品亚洲香蕉网站| 性色av香蕉一区二区| 国内精品久久久久伊人av| 欧美专区第一页| 久久国产色av| 亚洲国产91| 美脚丝袜一区二区三区在线观看 | 亚洲香蕉网站| 欧美日韩一级大片网址| 亚洲欧美美女| 狠狠狠色丁香婷婷综合激情| 欧美制服丝袜第一页| 欧美在线免费播放| 欧美日韩三区四区| 性感少妇一区| 久久久久久久91| 亚洲三级免费电影| 亚洲免费视频网站| 欧美午夜免费电影| 欧美一区二区三区视频在线观看 | 欧美一级理论片| 国产亚洲精品高潮| 欧美成人一二三| 亚洲日本久久| 久久精品一区蜜桃臀影院| 精品51国产黑色丝袜高跟鞋| 噜噜爱69成人精品| 亚洲综合色在线| 久久九九热re6这里有精品| 亚洲欧洲精品成人久久奇米网| 牛牛影视久久网| 久久综合一区| 性欧美暴力猛交另类hd| 国产视频不卡| 欧美日韩视频在线一区二区观看视频| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 亚洲特黄一级片| 久久久国产视频91| 亚洲国产va精品久久久不卡综合| 欧美日韩久久| 欧美在线一区二区| 一区二区黄色| 久久亚洲私人国产精品va| 亚洲直播在线一区| 亚洲国产一区二区视频| 国产性做久久久久久| 欧美精品 日韩| 日韩一级二级三级| 亚洲国产欧美另类丝袜| 香蕉av777xxx色综合一区| 亚洲精品一区二区三区四区高清| 国产精品视频不卡| 欧美体内谢she精2性欧美| 久久久久国产精品一区三寸| 亚洲精品三级| 亚洲国产精品一区制服丝袜| 欧美一区二区视频在线观看| 亚洲美女av黄| 在线欧美日韩国产| 国产欧美一区二区色老头| 欧美国产一区二区在线观看| 亚洲一区二区三区四区在线观看 | 妖精成人www高清在线观看| 开心色5月久久精品| 毛片一区二区三区| 亚洲淫性视频| 亚洲免费一区二区| 亚洲精品一区二区三区蜜桃久| 亚洲国产岛国毛片在线| 国产在线精品成人一区二区三区| 久久综合伊人77777蜜臀| 久久夜色撩人精品| 午夜精品久久久久久久久久久| aⅴ色国产欧美| 91久久夜色精品国产九色| 亚洲人成网站精品片在线观看| 国产精品稀缺呦系列在线| 国产精品女人网站| 欧美女人交a| 久久精品天堂| 免费高清在线一区| 久久中文欧美| 欧美日本不卡| 欧美日韩国产色视频| 国产精品高潮久久| 国产精品xxx在线观看www| 国产人成一区二区三区影院|