欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

VC中實現(xiàn)GB2312、BIG5、Unicode編碼轉(zhuǎn)換的方法

 更新時間:2014年07月21日 17:28:11   投稿:shichen2014  
這篇文章主要介紹了VC中實現(xiàn)GB2312、BIG5、Unicode編碼轉(zhuǎn)換的方法,該功能非常實用,需要的朋友可以參考下

本文主要以實例形式討論了VC編譯環(huán)境下,實現(xiàn)字符串和文件編碼方式轉(zhuǎn)換的方法,在linux下請使用Strconv來實現(xiàn)。具體方法如下:

一、文件編碼格式轉(zhuǎn)換

//GB2312 編碼文件轉(zhuǎn)換成 Unicode:
if((file_handle = fopen(filenam,"rb")) != NULL)
{
    //從GB2312源文件以二進(jìn)制的方式讀取buffer
    numread = fread(str_buf_pool,sizeof(char),POOL_BUFF_SIZE,file_handle);
    fclose(file_handle);
   //GB2312文件buffer轉(zhuǎn)換成UNICODE
   nLen  =MultiByteToWideChar(CP_ACP,0,str_buf_pool,-1,NULL,0); 
   MultiByteToWideChar(CP_ACP,0,str_buf_pool,-1,(LPWSTR)str_unicode_buf_pool,nLen);
   //組裝UNICODE Little Endian編碼文件文件頭標(biāo)示符"0xFF 0xFE" 
   //備注:UNICODE Big Endian編碼文件文件頭標(biāo)示符"0xFF 0xFE" 
   //Little Endian與Big Endian編碼差異此處不詳述
   unicode_little_file_header[0]=0xFF;
   unicode_little_file_header[1]=0xFE;
   //存儲目標(biāo)文件
   if((file_handle=fopen(filenewname,"wb+")) != NULL)
   {
   fwrite(unicode_little_file_header,sizeof(char),2,file_handle);
   numwrite = fwrite(str_unicode_buf_pool,sizeof(LPWSTR),nLen,file_handle);
   fclose(file_handle);
   }
}

二、字符串編碼格式轉(zhuǎn)換

//GB2312 轉(zhuǎn)換成 Unicode:
wchar_t* GB2312ToUnicode(const char* szGBString)
{
    UINT nCodePage = 936; //GB2312
    int nLength=MultiByteToWideChar(nCodePage,0,szGBString,-1,NULL,0);
    wchar_t* pBuffer = new wchar_t[nLength+1];
    MultiByteToWideChar(nCodePage,0,szGBString,-1,pBuffer,nLength);
    pBuffer[nLength]=0;
    return pBuffer;
}
//BIG5 轉(zhuǎn)換成 Unicode:
wchar_t* BIG5ToUnicode(const char* szBIG5String)
{
    UINT nCodePage = 950; //BIG5
    int nLength=MultiByteToWideChar(nCodePage,0,szBIG5String,-1,NULL,0);
    wchar_t* pBuffer = new wchar_t[nLength+1];
    MultiByteToWideChar(nCodePage,0,szBIG5String,-1,pBuffer,nLength);
    pBuffer[nLength]=0;
    return pBuffer;
}
//Unicode 轉(zhuǎn)換成 GB2312:
char* UnicodeToGB2312(const wchar_t* szUnicodeString)
{
    UINT nCodePage = 936; //GB2312
    int nLength=WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,NULL,0,NULL,NULL);
    char* pBuffer=new char[nLength+1];
    WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,pBuffer,nLength,NULL,NULL);
    pBuffer[nLength]=0;
    return pBuffer;
}
//Unicode 轉(zhuǎn)換成 BIG5:
char* UnicodeToBIG5(const wchar_t* szUnicodeString)
{
    UINT nCodePage = 950; //BIG5
    int nLength=WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,NULL,0,NULL,NULL);
    char* pBuffer=new char[nLength+1];
    WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,pBuffer,nLength,NULL,NULL);
    pBuffer[nLength]=0;
    return pBuffer;
}
//繁體中文BIG5 轉(zhuǎn)換成 簡體中文 GB2312
char* BIG5ToGB2312(const char* szBIG5String)
{
    LCID lcid = MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC);
    wchar_t* szUnicodeBuff = BIG5ToUnicode(szBIG5String);
    char* szGB2312Buff = UnicodeToGB2312(szUnicodeBuff);
    int nLength = LCMapString(lcid,LCMAP_SIMPLIFIED_CHINESE, szGB2312Buff,-1,NULL,0);
    char* pBuffer = new char[nLength + 1];
    LCMapString(0x0804,LCMAP_SIMPLIFIED_CHINESE,szGB2312Buff,-1,pBuffer,nLength);
    pBuffer[nLength] = 0;
    
    delete[] szUnicodeBuff;
    delete[] szGB2312Buff;
    return pBuffer;
}
//簡體中文 GB2312 轉(zhuǎn)換成 繁體中文BIG5
char* GB2312ToBIG5(const char* szGBString)
{
    LCID lcid = MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC);
    int nLength = LCMapString(lcid,LCMAP_TRADITIONAL_CHINESE,szGBString,-1,NULL,0);
    char* pBuffer=new char[nLength+1];
    LCMapString(lcid,LCMAP_TRADITIONAL_CHINESE,szGBString,-1,pBuffer,nLength);
    pBuffer[nLength]=0;
    wchar_t* pUnicodeBuff = GB2312ToUnicode(pBuffer);
    char* pBIG5Buff = UnicodeToBIG5(pUnicodeBuff);
    delete[] pBuffer;
    delete[] pUnicodeBuff;
    return pBIG5Buff;
}

三、API 函數(shù):MultiByteToWideChar參數(shù)說明

第一個參數(shù)為代碼頁, 用 GetLocaleInfo 函數(shù)獲取當(dāng)前系統(tǒng)的代碼頁,936: 簡體中文, 950: 繁體中文
第二個參數(shù)為選項,一般用 0 就可以了
第三個參數(shù)為 ANSI 字符串的地址, 這個字符串是第一個參數(shù)指定的語言的 ANSI 字符串 (AnsiString)
第四個參數(shù)為 ANSI 字符串的長度,如果用 -1, 就表示是用 0 作為結(jié)束符的字符串
第五個參數(shù)為轉(zhuǎn)化生成的 unicode 字符串 (WideString) 的地址, 如果為 NULL, 就是代表計算生成的字符串的長度
第六個參數(shù)為轉(zhuǎn)化生成的 unicode 字符串緩存的容量,也就是有多少個UNICODE字符。

相關(guān)文章

  • C++指向函數(shù)的指針實例解析

    C++指向函數(shù)的指針實例解析

    這篇文章主要介紹了C++指向函數(shù)的指針,需要的朋友可以參考下
    2014-07-07
  • C語言示例講解if else語句的用法

    C語言示例講解if else語句的用法

    這篇文章主要介紹C語言中的If Else語句怎么使用,在日常操作中,相信很多人在If Else語句怎么使用問題上存在疑惑,小編查閱了各式資料,整理出使用方法,接下來,請跟著小編一起來學(xué)習(xí)吧
    2022-06-06
  • 淺談c語言中轉(zhuǎn)義字符的用法及注意事項

    淺談c語言中轉(zhuǎn)義字符的用法及注意事項

    下面小編就為大家?guī)硪黄獪\談c語言中轉(zhuǎn)義字符的用法及注意事項。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • C++中vector和數(shù)組之間的轉(zhuǎn)換及其效率問題詳解

    C++中vector和數(shù)組之間的轉(zhuǎn)換及其效率問題詳解

    c++?vector轉(zhuǎn)數(shù)組是一種將vector容器的元素轉(zhuǎn)換為數(shù)組的方法,主要能幫助提高程序的性能和效率,下面這篇文章主要給大家介紹了關(guān)于C++中vector和數(shù)組之間的轉(zhuǎn)換及其效率問題的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • C語言實現(xiàn)掃雷代碼

    C語言實現(xiàn)掃雷代碼

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)掃雷代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C語言植物大戰(zhàn)數(shù)據(jù)結(jié)構(gòu)堆排序圖文示例

    C語言植物大戰(zhàn)數(shù)據(jù)結(jié)構(gòu)堆排序圖文示例

    這篇文章主要為大家介紹了C語言植物大戰(zhàn)數(shù)據(jù)結(jié)構(gòu)堆排序的圖文示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 關(guān)于嘗試開發(fā)PHP的MYSQL擴展的使用

    關(guān)于嘗試開發(fā)PHP的MYSQL擴展的使用

    本篇文章小編將為大家介紹,關(guān)于嘗試開發(fā)PHP的MYSQL擴展的使用,需要的朋友可以參考一下
    2013-04-04
  • C語言中#define與typedef的互換細(xì)節(jié)詳解

    C語言中#define與typedef的互換細(xì)節(jié)詳解

    本篇文章是對C語言中#define與typedef的互換細(xì)節(jié)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 詳解VS2019+OpenCV-4-1-0+OpenCV-contrib-4-1-0

    詳解VS2019+OpenCV-4-1-0+OpenCV-contrib-4-1-0

    這篇文章主要介紹了詳解VS2019+OpenCV-4-1-0+OpenCV-contrib-4-1-0,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • C++ 多線程編程建議之 C++ 對多線程/并發(fā)的支持(下)

    C++ 多線程編程建議之 C++ 對多線程/并發(fā)的支持(下)

    這篇文章主要介紹的是 C++ 多線程編程建議之 C++ 對多線程/并發(fā)的支持的相關(guān)資料,承接前文 現(xiàn)代 C++ 對多線程/并發(fā)的支持,接下來我們看看回發(fā)生什么吧
    2021-10-10

最新評論