日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

win32中GBK、UTF8的互转

發布時間:2025/4/5 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 win32中GBK、UTF8的互转 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>

//GBK編碼轉換到UTF8編碼
int GBKToUTF8(unsigned char * lpGBKStr,unsigned char * lpUTF8Str,int nUTF8StrLen)
{
?wchar_t * lpUnicodeStr = NULL;
?int nRetLen = 0;

?if(!lpGBKStr)? //如果GBK字符串為NULL則出錯退出
??return 0;

?nRetLen = ::MultiByteToWideChar(CP_ACP,0,(char *)lpGBKStr,-1,NULL,NULL);? //獲取轉換到Unicode編碼后所需要的字符空間長度
?lpUnicodeStr = new WCHAR[nRetLen + 1];? //為Unicode字符串空間
?nRetLen = ::MultiByteToWideChar(CP_ACP,0,(char *)lpGBKStr,-1,lpUnicodeStr,nRetLen);? //轉換到Unicode編碼
?if(!nRetLen)? //轉換失敗則出錯退出
??return 0;

?nRetLen = ::WideCharToMultiByte(CP_UTF8,0,lpUnicodeStr,-1,NULL,0,NULL,NULL);? //獲取轉換到UTF8編碼后所需要的字符空間長度

?if(!lpUTF8Str)? //輸出緩沖區為空則返回轉換后需要的空間大小
?{
??if(lpUnicodeStr)
???delete []lpUnicodeStr;
??return nRetLen;
?}

?if(nUTF8StrLen < nRetLen)? //如果輸出緩沖區長度不夠則退出
?{
??if(lpUnicodeStr)
???delete []lpUnicodeStr;
??return 0;
?}

?nRetLen = ::WideCharToMultiByte(CP_UTF8,0,lpUnicodeStr,-1,(char *)lpUTF8Str,nUTF8StrLen,NULL,NULL);? //轉換到UTF8編碼

?if(lpUnicodeStr)
??delete []lpUnicodeStr;

?return nRetLen;
}

// UTF8編碼轉換到GBK編碼
int UTF8ToGBK(unsigned char * lpUTF8Str,unsigned char * lpGBKStr,int nGBKStrLen)
{
?wchar_t * lpUnicodeStr = NULL;
?int nRetLen = 0;

?if(!lpUTF8Str)? //如果UTF8字符串為NULL則出錯退出
??return 0;

?nRetLen = ::MultiByteToWideChar(CP_UTF8,0,(char *)lpUTF8Str,-1,NULL,NULL);? //獲取轉換到Unicode編碼后所需要的字符空間長度
?lpUnicodeStr = new WCHAR[nRetLen + 1];? //為Unicode字符串空間
?nRetLen = ::MultiByteToWideChar(CP_UTF8,0,(char *)lpUTF8Str,-1,lpUnicodeStr,nRetLen);? //轉換到Unicode編碼
?if(!nRetLen)? //轉換失敗則出錯退出
??return 0;

?nRetLen = ::WideCharToMultiByte(CP_ACP,0,lpUnicodeStr,-1,NULL,NULL,NULL,NULL);? //獲取轉換到GBK編碼后所需要的字符空間長度

?if(!lpGBKStr)? //輸出緩沖區為空則返回轉換后需要的空間大小
?{
??if(lpUnicodeStr)
???delete []lpUnicodeStr;
??return nRetLen;
?}

?if(nGBKStrLen < nRetLen)? //如果輸出緩沖區長度不夠則退出
?{
??if(lpUnicodeStr)
???delete []lpUnicodeStr;
??return 0;
?}

?nRetLen = ::WideCharToMultiByte(CP_ACP,0,lpUnicodeStr,-1,(char *)lpGBKStr,nRetLen,NULL,NULL);? //轉換到GBK編碼

?if(lpUnicodeStr)
??delete []lpUnicodeStr;

?return nRetLen;
}


int _tmain(int argc, _TCHAR* argv[])
{
?char cGBKStr[] = "上證指數!";
?char * lpGBKStr = NULL;
?char * lpUTF8Str = NULL;
?FILE * fp = NULL;
?int nRetLen = 0;

?nRetLen = GBKToUTF8((unsigned char *)cGBKStr,NULL,NULL);
?printf("轉換后的字符串需要的空間長度為:%d ",nRetLen);
?lpUTF8Str = new char[nRetLen + 1];
?nRetLen = GBKToUTF8((unsigned char *)cGBKStr,(unsigned char *)lpUTF8Str,nRetLen);
?if(nRetLen)
?{
??printf("GBKToUTF8轉換成功!");
?}
?else
?{
??printf("GBKToUTF8轉換失敗!");
??goto Ret0;
?}

?fp = fopen("C:\\GBK2UTF8.txt","wb");? //保存到文本文件
?fwrite(lpUTF8Str,nRetLen,1,fp);
?fclose(fp);

?getchar();? //先去打開那個文本文件看看,單擊記事本的“文件”-“另存為”菜單,在對話框中看到編碼框變為了“UTF-8”說明轉換成功了

?nRetLen = UTF8ToGBK((unsigned char *)lpUTF8Str,NULL,NULL);? //再轉回來
?printf("轉換后的字符串需要的空間長度為:%d ",nRetLen);
?lpGBKStr = new char[nRetLen + 1];
?nRetLen = UTF8ToGBK((unsigned char *)lpUTF8Str,(unsigned char *)lpGBKStr,nRetLen);
?if(nRetLen)
?{
??printf("UTF8ToGBK轉換成功! ");
?}
?else
?{
??printf("UTF8ToGBK轉換失敗! ");
??goto Ret0;
?}

?fp = fopen("C:\\UTF82GBK.txt","wb");? //保存到文本文件
?fwrite(lpGBKStr,nRetLen,1,fp);
?fclose(fp);

?getchar();? //再去打開文本文件看看,發現編碼框又變為了“ANSI”說明轉換成功了

Ret0:
?if(lpGBKStr)
??delete []lpGBKStr;

?if(lpUTF8Str)
??delete []lpUTF8Str;

?return 0;
}

總結

以上是生活随笔為你收集整理的win32中GBK、UTF8的互转的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。