C++编译器对字符串的编码转换

合集下载

C语言-字符编码转换:UTF与GB2312

C语言-字符编码转换:UTF与GB2312

C语⾔-字符编码转换:UTF与GB2312依赖库libiconv,libiconv库的交叉编译不做描述,⽹上很多1 #include <stdio.h>2 #include <stdlib.h>3 #include <stdint.h>4 #include "iconv.h"5 #include "eventlist.h"67static int ChangeCode( const char* pFromCode, const char* pToCode, const char* pInBuf,8 size_t* piInLen, char* pOutBuf, size_t* piOutLen )9 {10int iRet;11char **pin = &pInBuf;12char **pout = &pOutBuf;13 iconv_t hIconv;1415//printf("%s: outlen=%d, inlen=%d\n", __FUNCTION__, *piOutLen, *piInLen);1617//打开字符集转换18 hIconv = iconv_open( pToCode, pFromCode );19if ( -1 == (int)hIconv )20 {21 perror("iconv_open");22return -1;23 }24//开始转换25 printf("%s: 1 outlen=%d\n", __FUNCTION__, *piOutLen);26 iRet = iconv( hIconv, pin, piInLen, pout, piOutLen );27if ( -1 == iRet )28 {29 perror("iconv");30return -1;31 }32 printf("%s: 2 outlen=%d\n", __FUNCTION__, *piOutLen);3334//关闭字符集转换35 iconv_close( hIconv );3637 **pout = '\0';38return iRet;39 }4041static int MAIN_UTFToGb2312(char * pcFrom, char * pcTo, int iMaxToLen)42 {43char * psInBuf = NULL;44char * psOutBuf = NULL;45 unsigned int iInLen = 0;46 unsigned int iOutLen = 0;47int iRet;4849 iInLen = strlen(pcFrom)+1;50 psInBuf = (char *)malloc(iInLen);51if ( NULL == psInBuf )52 {53return0;54 }55 memset(psInBuf, 0x0, iInLen);56 memcpy(psInBuf, pcFrom, iInLen);5758 iOutLen = iMaxToLen;59 psOutBuf = (char *)malloc(iOutLen);60if ( NULL == psOutBuf )61 {62 free(psInBuf);63 psInBuf = NULL;64return0;65 }66 memset(psOutBuf, 0x0, iOutLen);6768 iRet = ChangeCode( "utf-8", "gb2312", psInBuf, &iInLen, psOutBuf, &iOutLen );69//iRet = u2g(psInBuf, iInLen, psOutBuf, iOutLen);70if ( 0 != iRet )71 {72 printf("ChangeCode: Error\n");73//return 0;74 }75 memcpy(pcTo, psOutBuf, iOutLen);76 printf("%s: iOutLen = %d\n", __FUNCTION__, iOutLen);7778 free(psInBuf);79 psInBuf = NULL;80 free(psOutBuf);81 psOutBuf = NULL;8283return iOutLen;8485 }8687static int MAIN_GB2312ToUTF(char * pcFrom, char * pcTo, int iMaxToLen)88 {89char * psInBuf = NULL;90char * psOutBuf = NULL;91 unsigned int iInLen = 0;92 unsigned int iOutLen = 0;93int iRet;9495 iInLen = strlen(pcFrom)+1;96 psInBuf = (char *)malloc(iInLen);97if ( NULL == psInBuf )98 {99return0;100 }101 memset(psInBuf, 0x0, iInLen);102 memcpy(psInBuf, pcFrom, iInLen);103104 iOutLen = iMaxToLen;105 psOutBuf = (char *)malloc(iOutLen);106if ( NULL == psOutBuf )107 {108 free(psInBuf);109 psInBuf = NULL;110return0;111 }112 memset(psOutBuf, 0x0, iOutLen);113114 iRet = ChangeCode( "gb2312", "utf-8", psInBuf, &iInLen, psOutBuf, &iOutLen );115//iRet = u2g(psInBuf, iInLen, psOutBuf, iOutLen);116if ( 0 != iRet )117 {118 printf("ChangeCode: Error\n");119//return 0;120 }121 memcpy(pcTo, psOutBuf, iOutLen);122 printf("%s: iOutLen = %d\n", __FUNCTION__, iOutLen);123124 free(psInBuf);125 psInBuf = NULL;126 free(psOutBuf);127 psOutBuf = NULL;128129return iOutLen;130131 }132133int main()134 {135char strUTF[]={1360xE5, 0xBC, 0x80, 0xE8,0xBD, 0xA6, 0xE4, 0xBA, 0x8B, 0xE4, 0xBB, 0xB6, 0xE5, 0xBC, 0x80, 0xE8,0xBD, 0xA6, 0xE4, 0xBA, 0x8B, 0xE4, 0xBB, 0xB6, 1370xE5, 0xBC, 0x80, 0xE8,0xBD, 0xA6, 0xE4, 0xBA, 0x8B, 0xE4, 0xBB, 0xB6, 0xE5, 0xBC, 0x80, 0xE8,0xBD, 0xA6, 0xE4, 0xBA, 0x8B, 0xE4, 0xBB, 0xB6, 1380xE5, 0xBC, 0x80, 0xE8,0xBD, 0xA6, 0xE4, 0xBA, 0x8B, 0xE4, 0xBB, 0xB6, 0xE5, 0xBC, 0x80, 0xE8,0xBD, 0xA6, 0xE4, 0xBA, 0x8B, 0xE4, 0xBB, 0xB6, 1390xE5, 0xBC, 0x80, 0xE8,0xBD, 0xA6, 0xE4, 0xBA, 0x8B, 0xE4, 0xBB, 0xB6, 0xE5, 0xBC, 0x80, 0xE8,0xBD, 0xA6, 0xE4, 0xBA, 0x8B, 0xE4, 0xBB, 0xB6, 1400xE5, 0xBC, 0x80, 0xE8,0xBD, 0xA6, 0xE4, 0xBA, 0x8B, 0xE4, 0xBB, 0xB6, 0xE5, 0xBC, 0x80, 0xE8,0xBD, 0xA6, 0xE4, 0xBA, 0x8B, 0xE4, 0xBB, 0xB6, 1410xE5, 0xBC, 0x80, 0xE8,0xBD, 0xA6, 0xE4, 0xBA, 0x8B, 0xE4, 0xBB, 0xB6, 0xE5, 0xBC, 0x80, 0xE8,0xBD, 0xA6, 0xE4, 0xBA, 0x8B, 0xE4, 0xBB, 0xB6, 1420x00, 0x00, 0x00143 };144char chTmpStr[256];145int len = 0;146147 memset(chTmpStr, 0x0, 256);148 MAIN_UTF2Gb2312(strUTF, chTmpStr, 256);149 printf("Main: change=%s\n", chTmpStr);150151return0;152 }。

c中实现utf8和gbk的互转

c中实现utf8和gbk的互转

21. iconv_close(cd); 22. *pout = '\0'; 23. 24. return 0; 25. } 26. 27. int u2g(char *inbuf, size_t inlen, char *outbuf, size_t o utlen) { 28. return code_convert("utf-8", "gb2312", inbuf, inlen, ou tbuf, outlen); 29. } 30. 31. int g2u(char *inbuf, size_t inlen, char *outbuf, size_t o utlen) { 32. return code_convert("gb2312", "utf-8", inbuf, inlen, ou tbuf, outlen); 33. } 34. 35. int main(void) { 36. char *s = "中国"; 37. int fd = open("test.txt", O_RDWR|O_CREAT, S_IRUS R | S_IWUSR); 38. char buf[10]; 39. u2g(s, strlen(s), buf, sizeof(buf)); 40. write(fd, buf, strlen(buf)); 41. close(fd); 42. 43. fd = open("test.txt2", O_RDWR|O_CREAT, S_IRUSR | S_I WUSR); 44. char buf2[10];
c 中实现 utf8 和 gbk 的互转
c 中实现 utf8 和 gbk 的互转 博客分ห้องสมุดไป่ตู้: • c&c++ • linux

c语言中字符串转换为utf-8编码

c语言中字符串转换为utf-8编码

c语言中字符串转换为utf-8编码在C语言中,字符串默认使用ASCII编码,要将字符串转换为UTF-8编码,可以使用iconv库函数进行转换。

以下是一个示例代码:```#include <stdio.h>#include <iconv.h>int main() {char input_str[] = "Hello, 你好!"; // 原始字符串char output_str[1024]; // 转换后的字符串char *inbuf = input_str;char *outbuf = output_str;size_t inbytesleft = sizeof(input_str);size_t outbytesleft = sizeof(output_str);iconv_t cd = iconv_open("UTF-8", "ASCII"); // 新编码为UTF-8,旧编码为ASCIIiconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft); // 转换printf("转换后的字符串:%s", output_str);iconv_close(cd); // 关闭转换器return 0;}```运行结果:```转换后的字符串:Hello, 你好!```需要注意的是,iconv函数的第一个参数是iconv_t类型的转换器句柄,可以通过iconv_open函数创建,最后需要通过iconv_close 函数关闭。

此外,需要注意输入和输出缓冲区的大小,避免越界。

C#基础知识:字符编码、编码转换

C#基础知识:字符编码、编码转换

C#基础知识:字符编码、编码转换⼀、 ASCII码我们知道,在计算机内部,所有的信息最终都表⽰为⼀个⼆进制的字符串。

每⼀个⼆进制位(bit)有0和1两种状态,因此⼋个⼆进制位就可以组合出256种状态,这被称为⼀个字节(byte)。

也就是说,⼀个字节⼀共可以⽤来表⽰256种不同的状态,每⼀个状态对应⼀个符号,就是256个符号,从00000000到11111111。

上个世纪60年代,美国制定了⼀套字符编码,对英语字符与⼆进制位之间的关系,做了统⼀规定。

这被称为ASCII码,⼀直沿⽤⾄今。

ASCII码⼀共规定了128个字符的编码,⽐如空格“SPACE”是32(⼆进制00100000),⼤写的字母A是65(⼆进制01000001)。

这128个符号(包括32个不能打印出来的控制符号),只占⽤了⼀个字节的后⾯7位,最前⾯的1位统⼀规定为0。

在C#中如果你想看看某个字母的ASCII码是多少,可以使⽤表⽰字符编码的类Encoding ,代码如下:string s = "a";byte[] ascii = Encoding.ASCII.GetBytes(s);我们通过调试器可以看到ascii中为97,也就是说a的ASCII码为97(1100001)⼆、⾮ASCII编码英语⽤128个符号编码就够了,但是⽤来表⽰其他语⾔,128个符号是不够的。

⽐如,在法语中,字母上⽅有注⾳符号,它就⽆法⽤ASCII码表⽰。

于是,⼀些欧洲国家就决定,利⽤字节中闲置的最⾼位编⼊新的符号。

⽐如,法语中的é的编码为130(⼆进制10000010)。

这样⼀来,这些欧洲国家使⽤的编码体系,可以表⽰最多256个符号。

但是,这⾥⼜出现了新的问题。

不同的国家有不同的字母,因此,哪怕它们都使⽤256个符号的编码⽅式,代表的字母却不⼀样。

⽐如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel ,在俄语编码中⼜会代表另⼀个符号。

VC中实现GB2312、BIG5、Unicode编码转换的方法

VC中实现GB2312、BIG5、Unicode编码转换的方法

VC中实现GB2312、BIG5、Unicode编码转换的⽅法本⽂主要以实例形式讨论了VC编译环境下,实现字符串和⽂件编码⽅式转换的⽅法,在linux下请使⽤Strconv来实现。

具体⽅法如下:⼀、⽂件编码格式转换//GB2312 编码⽂件转换成 Unicode:if((file_handle = fopen(filenam,"rb")) != NULL){//从GB2312源⽂件以⼆进制的⽅式读取buffernumread = fread(str_buf_pool,sizeof(char),POOL_BUFF_SIZE,file_handle);fclose(file_handle);//GB2312⽂件buffer转换成UNICODEnLen =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编码⽂件⽂件头标⽰符"0xFF 0xFE"//备注:UNICODE Big Endian编码⽂件⽂件头标⽰符"0xFF 0xFE"//Little Endian与Big Endian编码差异此处不详述unicode_little_file_header[0]=0xFF;unicode_little_file_header[1]=0xFE;//存储⽬标⽂件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);}}⼆、字符串编码格式转换//GB2312 转换成 Unicode:wchar_t* GB2312ToUnicode(const char* szGBString){UINT nCodePage = 936; //GB2312int 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 转换成 Unicode:wchar_t* BIG5ToUnicode(const char* szBIG5String){UINT nCodePage = 950; //BIG5int 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 转换成 GB2312:char* UnicodeToGB2312(const wchar_t* szUnicodeString){UINT nCodePage = 936; //GB2312int 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 转换成 BIG5:char* UnicodeToBIG5(const wchar_t* szUnicodeString){UINT nCodePage = 950; //BIG5int 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 转换成简体中⽂ GB2312char* 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 转换成繁体中⽂BIG5char* 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 函数:MultiByteToWideChar参数说明第⼀个参数为代码页, ⽤ GetLocaleInfo 函数获取当前系统的代码页,936: 简体中⽂, 950: 繁体中⽂第⼆个参数为选项,⼀般⽤ 0 就可以了第三个参数为 ANSI 字符串的地址, 这个字符串是第⼀个参数指定的语⾔的 ANSI 字符串 (AnsiString)第四个参数为 ANSI 字符串的长度,如果⽤ -1, 就表⽰是⽤ 0 作为结束符的字符串第五个参数为转化⽣成的 unicode 字符串 (WideString) 的地址, 如果为 NULL, 就是代表计算⽣成的字符串的长度第六个参数为转化⽣成的 unicode 字符串缓存的容量,也就是有多少个UNICODE字符。

【miscellaneous】【CC++语言】UTF8与GBK字符编码之间的相互转换

【miscellaneous】【CC++语言】UTF8与GBK字符编码之间的相互转换

【miscellaneous】【CC++语⾔】UTF8与GBK字符编码之间的相互转换⼀预备知识1,字符:字符是抽象的最⼩⽂本单位。

它没有固定的形状(可能是⼀个字形),⽽且没有值。

“A”是⼀个字符,“€”(德国、法国和许多其他欧洲国家通⽤货币的标志)也是⼀个字符。

“中”“国”这是两个汉字字符。

字符仅仅代表⼀个符号,没有任何实际值的意义。

2,字符集:字符集是字符的集合。

例如,汉字字符是中国⼈最先发明的字符,在中⽂、⽇⽂、韩⽂和越南⽂的书写中使⽤。

这也说明了字符和字符集之间的关系,字符组成字符集(iso8859-1,GB2312/GBK,unicode)。

3,代码点:字符集中的每个字符都被分配到⼀个“代码点”。

每个代码点都有⼀个特定的唯⼀数值,称为标值。

该标量值通常⽤⼗六进制表⽰。

4,代码单元:在每种编码形式中,代码点被映射到⼀个或多个代码单元。

“代码单元”是各个编码⽅式中的单个单元。

代码单元的⼤⼩等效于特定编码⽅式的位数: UTF-8:UTF-8 中的代码单元由 8 位组成;在 UTF-8 中,因为代码单元较⼩的缘故,每个代码点常常被映射到多个代码单元。

代码点将被映射到⼀个、两个、三个或四个代码单元; UTF-16 :UTF-16 中的代码单元由 16 位组成;UTF-16 的代码单元⼤⼩是 8 位代码单元的两倍。

所以,标量值⼩于 U+10000 的代码点被编码到单个代码单元中;UTF-32:UTF-32 中的代码单元由 32 位组成; UTF-32 中使⽤的 32 位代码单元⾜够⼤,每个代码点都可编码为单个代码单元; GB18030:GB18030 中的代码单元由 8位组成;在 GB18030 中,因为代码单元较⼩的缘故,每个代码点常常被映射到多个代码单元。

代码点将被映射到⼀个、两个或四个代码单元。

5,举例: “中国北京⾹蕉是个⼤笨蛋”这是我定义的aka字符集;各字符对应代码点为:北 00000001京 00000010⾹ 10000001蕉 10000010是 10000100个 10001000⼤ 10010000笨 10100000蛋 11000000中 00000100国 00001000下⾯是我定义的 zixia 编码⽅案(8位),可以看到它的编码中表⽰了aka字符集的所有字符对应的代码单元;北 10000001 京 10000010 ⾹ 00000001 蕉 00000010 是 00000100 个 00001000 ⼤ 00010000 笨 00100000 蛋 01000000 中 10000100 国 10001000所谓⽂本⽂件就是我们按⼀定编码⽅式将⼆进制数据表⽰为对应的⽂本如 00000001000000100000010000001000000100000010000001000000这样的⽂件。

c_实现GB2312和UTF8字符编码方式的转换

c_实现GB2312和UTF8字符编码方式的转换

public string UTF8ToGB2312(string str){try{Encoding utf8 = Encoding.GetEncoding(65001);Encoding gb2312 =Encoding.GetEncoding("gb2312");//Encoding.Default ,936byte[] temp = utf8.GetBytes(str);byte[] temp1 = Encoding.Convert(utf8, gb2312, temp); string result = gb2312.GetString(temp1);return result;}catch (Exception ex)//(UnsupportedEncodingException ex) {MessageBox.Show(ex.ToString());return null;}}public string GB2312ToUTF8(string str){try{Encoding uft8 = Encoding.GetEncoding(65001);Encoding gb2312 = Encoding.GetEncoding("gb2312");byte[] temp = gb2312.GetBytes(str);MessageBox.Show("gb2312的编码的字节个数:" +temp.Length);for (int i = 0; i < temp.Length; i++){MessageBox.Show(Convert.ToUInt16(temp[i]).ToStrin g());}byte[] temp1 = Encoding.Convert(gb2312, uft8, temp); MessageBox.Show("uft8的编码的字节个数:" +temp1.Length);for (int i = 0; i < temp1.Length; i++){MessageBox.Show(Convert.ToUInt16(temp1[i]).ToStri ng());}string result = uft8.GetString(temp1);return result;}catch (Exception ex)//(UnsupportedEncodingException ex){MessageBox.Show(ex.ToString());return null;}}代码说明:Encoding utf8 = Encoding.GetEncoding(65001);//使用code page Encoding gb2312 = Encoding.GetEncoding("gb2312");//通过bodyname 获取字符编码字节序列:byte[] temp=utf8.GetBytes(str);编码方式转换:byte[] temp1=Encoding.Convert(utf8, gb2312, temp); 获取编码的字符串:string str1=gb2312.GetString(temp1);这样即完成了字符编码的转换。

c++字符集之间转换(UTF-8,UNICODE,Gb2312)

c++字符集之间转换(UTF-8,UNICODE,Gb2312)
tmp = rst[j+2] = buf[2];
j += 3;
i += 2;
}
}
rst[j] = ’’;
//返回结果
pOut = rst;
delete[]rst;
return;
}
voidCChineseCode::UTF_8ToGB2312(string &pOut, char*pText, intpLen){
return;
}
voidCChineseCode::UnicodeToGB2312(char* pOut,wchar_tuData){
WideCharToMultiByte(CP_ACP,NULULL,NULL);
return;
}
voidCChineseCode::Gb2312ToUnicode(wchar_t* pOut,char*gbBuffer){
}else{
wchar_tpbuffer;
Gb2312ToUnicode(&pbuffer,pText+i);
UnicodeToUTF_8(buf,&pbuffer);
unsigned shortinttmp = 0;
tmp = rst[j] = buf[0];
tmp = rst[j+1] = buf[1];
};
//类实现
voidCChineseCode::UTF_8ToUnicode(wchar_t* pOut,char*pText){
char* uchar = (char*)pOut;
uchar[1] = ((pText[0] & 0x0F) << 4) + ((pText[1] >> 2) & 0x0F);

C#_汉字与GBK,Unicode,UTF-8编码之间的转换

C#_汉字与GBK,Unicode,UTF-8编码之间的转换

C#_汉字与GBK,Unicode,UTF-8编码之间的转换IT发展⾄今,字符编码版本众多,⽬前流⾏的GBK,Unicode,UTF-8编码与汉字的转换可⽤如下代码: private void button1_Click(object sender, EventArgs e){//汉字转为Unicode编码:string hz = textBox1.Text.ToString();byte[] b=Encoding.Unicode.GetBytes(hz);string o = "";foreach(var x in b){o += string.Format("{0:X2}",x) + " ";}textBox2.Text = o;}private void button2_Click(object sender, EventArgs e){//Unicode编码转为汉字:string cd = textBox2.Text.ToString();string cd2 = cd.Replace(" ", "");cd2 = cd2.Replace("\r", "");cd2 = cd2.Replace("\n", "");cd2 = cd2.Replace("\r\n", "");cd2 = cd2.Replace("\t", "");if (cd2.Length % 4 != 0){MessageBox.Show("Unicode编码为双字节,请删多或补少!确保是⼆的倍数。

");}else{int len = cd2.Length / 2;byte[] b = new byte[len];for (int i = 0; i < cd2.Length;i+=2 ){string bi = cd2.Substring(i, 2);b[i/2] =(byte) Convert.ToInt32(bi, 16);}string o=Encoding.Unicode.GetString(b);textBox1.Text = o;}}private void button5_Click(object sender, EventArgs e){//汉字转成GBK⼗六进制码:string hz = textBox3.Text.ToString();byte[] gbk = Encoding.GetEncoding("GBK").GetBytes(hz);string s1 = ""; string s1d = "";foreach(byte b in gbk){//s1 += Convert.ToString(b, 16)+" ";s1 += string.Format("{0:X2}", b) + " ";s1d += b + " ";toolTip1.SetToolTip(textBox4, s1d);}textBox4.Text = s1;toolTip1.SetToolTip(textBox4, s1d);//汉字转成Unicode⼗六进制码:byte[] uc = Encoding.Unicode.GetBytes(hz);string s2 = ""; string s2d = "";foreach (byte b in uc){//s2 += Convert.ToString(b, 16) + " ";s2 += string.Format("{0:X2}", b) + " ";s2d += b + " ";toolTip1.SetToolTip(textBox5, s2d);}textBox5.Text = s2;toolTip1.SetToolTip(textBox5, s2d);//汉字转成UTF-8⼗六进制码:byte[] utf8 = Encoding.UTF8.GetBytes(hz);string s3 = ""; string s3d = "";foreach (byte b in utf8){//s3 += Convert.ToString(b, 16) + " ";s3 += string.Format("{0:X2}", b) + " ";s3d += b + " ";toolTip1.SetToolTip(textBox6, s3d);}textBox6.Text = s3;toolTip1.SetToolTip(textBox6, s3d);}private void button6_Click(object sender, EventArgs e){ //GBK⼗六进制码转成汉字:string cd = textBox4.Text.ToString();string[] b4 = cd.Split(' ');byte[] bs=new byte[2];bs[0] = (byte)Convert.ToByte(b4[0], 16);bs[1] = (byte)Convert.ToByte(b4[1], 16);textBox3.Text =Encoding.GetEncoding("GBK").GetString(bs);}private void button7_Click(object sender, EventArgs e){ //Unicode⼗六进制码转成汉字:string cd = textBox5.Text.ToString();string[] b5 = cd.Split(' ');byte[] bs = new byte[2];bs[0] = (byte)Convert.ToByte(b5[0], 16);bs[1] = (byte)Convert.ToByte(b5[1], 16);textBox3.Text = Encoding.GetEncoding("Unicode").GetString(bs); }private void button8_Click(object sender, EventArgs e){ //UTF-8⼗六进制码转成汉字:string cd = textBox6.Text.ToString();string[] b6 = cd.Split(' ');byte[] bs = new byte[3];bs[0] = (byte)Convert.ToByte(b6[0], 16);bs[1] = (byte)Convert.ToByte(b6[1], 16);bs[2] = (byte)Convert.ToByte(b6[2], 16);textBox3.Text = Encoding.GetEncoding("UTF-8").GetString(bs); }url:。

字符串转码UTF8转码为GBK的C语言程序源代码

字符串转码UTF8转码为GBK的C语言程序源代码

字符串转码UTF8转码为GBK的C语⾔程序源代码GBK和UTF8之间的转换可以使⽤两个API,⽅法是先把它们转换为中间编码Unicode,再转换为对应的编码即可。

#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编码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编码return nRetLen;}//使⽤这两个函数的例⼦int main(){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:\GBK转UTF8.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:\UTF8转GBK.txt","wb"); //保存到⽂本⽂件fwrite(lpGBKStr,nRetLen,1,fp);fclose(fp);getchar(); //再去打开⽂本⽂件看看,发现编码框⼜变为了“ANSI”说明转换成功了Ret0:if(lpGBKStr)delete []lpGBKStr;if(lpUTF8Str)delete []lpUTF8Str;return 0;}。

c语言int转ascii码的函数_概述说明

c语言int转ascii码的函数_概述说明

c语言int转ascii码的函数概述说明1. 引言1.1 概述C语言是一种广泛应用的编程语言,其灵活性和效率使其成为许多开发者的首选。

在C语言中,我们经常需要操作字符和字符串,并进行字符编码转换。

本文将重点探讨如何将int类型转换为ASCII码(American Standard Code for Information Interchange)。

1.2 文章结构本文共分为五个部分,分别是引言、正文、方法说明、示例代码以及结论与总结。

在引言部分,我们将简要介绍文章背景和结构,并明确本文的目的。

正文部分将详细讲解C语言中int和ASCII码之间的关系,以及两种不同方式实现int转ASCII码的方法。

接下来,在方法说明部分,我们将逐步解释这两种转换方式的具体步骤。

然后,在示例代码部分,我们将提供使用这两种方式进行int到ASCII 码转换的具体示例代码。

最后,在结论与总结部分中,我们将对比并分析这两种方法的优缺点,并给出总结和建议。

1.3 目的本文旨在帮助读者理解C语言中int类型与ASCII码之间的关系,并提供了两种常用方法实现int到ASCII码转换。

通过阅读本文,读者可以深入了解这些转换方法,并根据自己的需要选择适合的方式。

希望本文对学习和应用C语言的开发者们有所帮助。

2. 正文:2.1 C语言中int和ASCII码的关系在C语言中,每一个字符都有对应的ASCII码值。

ASCII码是一种字符编码标准,使用一个字节(8位)来表示一个字符。

其中,0到127之间的ASCII码对应着常见的英文字母、数字、标点符号以及部分控制字符。

而在C语言中,整数类型int也占用4个字节(32位)。

因此,在将int类型数据转换为ASCII码时,可以利用这种关系进行相应的转换操作。

2.2 int转ASCII码的方式一一种常见的将int类型数据转换为对应的ASCII码值的方式是通过强制类型转换实现。

通过将int类型变量赋值给char类型变量,并且直接打印该char类型变量的取值,即可得到该int型数字对应的ASCII码。

C++11Unicode编码转换

C++11Unicode编码转换

C++11Unicode编码转换1.char16_t与char32_t在C++98中,为了⽀持Unicode字符,使⽤wchar_t类型来表⽰“宽字符”,但并没有严格规定位宽,⽽是让wchar_t的宽度由编译器实现,因此不同的编译器有着不同的实现⽅式,GNU C++规定wchar_t为32位,Visual C++规定为16位。

由于wchar_t宽度没有⼀个统规定,导致使⽤wchar_t的代码在不同平台间移植时,可能出现问题。

这⼀状况在C++11中得到了⼀定的改善,从此Unicode字符的存储有了统⼀类型:(1)char16_t:⽤于存储UTF-16编码的Unicode字符。

(2)char32_t:⽤于存储UTF-32编码的Unicode字符。

⾄于UTF-8编码的Unicode数据,C++11还是使⽤了8bits宽度的char类型数组来表⽰,⽽char16_t和char32_t的宽度由其名称可以看出,char16_t为16bits,char32_t为32bits。

2.定义字符串的5种⽅式除了使⽤新类型char16_t与char32_t来表⽰Unicode字符,此外,C++11还新增了三种前缀来定义不同编码的字符串,新增前缀如下:(1)u8表⽰为UTF-8编码;(2)u表⽰为UTF-16编码;(3)U表⽰为UTF-32编码。

C++98中有两种定义字符串的⽅式,⼀是直接使⽤双引号定义多字节字符串,⼆是通过前缀“L”表⽰wchar_t字符串(宽字符串)。

⾄此,C++中共有5种定义字符串的⽅式。

3.影响字符串正确处理的因素在使⽤不同⽅式定义不同编码的字符串时,我们需要注意影响字符串处理和显⽰的⼏个因素有编辑器、编译器和输出环境。

代码编辑器采⽤何种编码⽅式决定了字符串最初的编码,⽐如编辑器如果采⽤GBK,那么代码⽂件中的所有字符都是以GBK 编码存储。

当编译器处理字符串时,可以通过前缀来判断字符串的编码类型,如果⽬标编码与原编码不同,则编译器会进⾏转换,⽐如C++11中的前缀u8表⽰⽬标编码为UTF-8的字符,如果代码⽂件采⽤的是GBK,编译器按照UTF-8去解析字符串常量,则可能会出现错误。

详解C++中的ANSI与Unicode和UTF8三种字符编码基本原理与相互转换

详解C++中的ANSI与Unicode和UTF8三种字符编码基本原理与相互转换

详解C++中的ANSI与Unicode和UTF8三种字符编码基本原理与相互转换⽬录1、概述2、Visual Studio中的字符编码3、ANSI窄字节编码4、Unicode宽字节编码5、UTF8编码6、如何使⽤字符编码7、三种字符编码之间的相互转换(附源码)7.1、ANSI编码与Unicode编码之间的转换7.2、UTF8编码与Unicode编码之间的转换7.3、ANSI编码与UTF8编码之间的转换8、Windows系统对使⽤ANSI窄字节字符编码的程序的兼容9、字符编码导致程序启动失败的案例1、概述在⽇常的软件开发过程中,会时不时地去处理不同编码格式的字符串,特别是在处理⽂件路径的相关场景中,⽐如我们要通过路径去读写⽂件、通过路径去加载库⽂件等。

常见的字符编码格式有ANSI窄字节编码、Unicode宽字节编码以及UTF8可变长编码。

在Linux系统中,主要使⽤UTF8编码;在Windows系统中,既⽀持ANSI编码,也⽀持Unicode编码。

通⽤的⼤⼩写字母和数字则使⽤全球统⼀的固定编码,即ASCII码。

ANSI编码是各个国家不同语种下的字符编码,其字符的编码值只在该语种中有效,不是全球统⼀编码的,⽐如中⽂的GB2312编码就是简体中⽂的ANSI编码。

Unicode编码则是全球统⼀的双字节编码,所有语种的字符在⼀起统⼀的编码,每个字符的编码都是全球唯⼀的。

UTF8编码是⼀种可变长的宽字节编码,也是⼀种全球统⼀的字符编码。

本⽂将以WIndows中使⽤Visual Studio进⾏C++编程时需要处理的字符编码问题为切⼊点,详细讲解⼀下字符编码的相关内容。

2、Visual Studio中的字符编码在Visual Studio中编写C++代码时,该如何指定字符串的编码呢?其实很简单,使⽤双引号括住的字符串,使⽤的就是ANSI 窄字节编码;使⽤L+双引号括住的字符串,使⽤的就是Unicode宽字节编码,如下所⽰:char* pStr = "This is a Test."; // ANSI编码WCHAR* pWStr = L"This is a Test."; // Unicode宽字节编码我们也可以使⽤_T宏定义来指定字符串的编码格式:TCHAR* pStr = _T("This is a Test.");设置_T后,则由⼯程配置属性中的字符集设置来确定到底是使⽤哪种编码:如果选择多字节字符集,_T就被解释为双引号,即使⽤ANSI窄字节编码;如果选择Unicode字符集,_T就被解释为L,即使⽤Unicode宽字节编码。

utf-8编码转换中文 c 代码

utf-8编码转换中文 c 代码

标题:utf-8编码转换中文C代码摘要:本文将介绍如何使用C语言编写程序将utf-8编码转换为中文字符,并给出详细的代码示例和说明。

1. 背景介绍在日常的编程工作中,经常会遇到需要处理中文字符的情况。

而随着全球化的发展,utf-8编码也成为了最常见的字符编码方式。

编写一个能够将utf-8编码转换为中文字符的C程序是非常有意义的。

2. utf-8编码原理utf-8是一种变长字符编码方式,采用1到4个字节来表示一个字符。

在utf-8编码中,中文字符通常采用3个字节来表示。

每个字节的最高位用来表示该字符的长度,后面的7位用来表示实际的数据。

3. C语言实现在C语言中,可以通过一些位运算和逻辑运算来对utf-8编码进行解析,然后将其转换为中文字符。

以下是一个简单的示例:```c#include <stdio.h>void utf8_to_unicode(const char *utf8, int *unicode) {unsigned char *p = (unsigned char*)utf8;for (int i = 0; i < 3; i++) {*unicode = (*unicode << 6) + (*p 0x3f);p++;}}int m本人n() {const char *utf8 = "\xe4\xb8\xad";int unicode = 0;utf8_to_unicode(utf8, unicode);printf("utf-8编码转换为unicode:x\n", unicode);return 0;}```4. 代码解析在上面的示例中,我们定义了一个`utf8_to_unicode`函数,用来将utf-8编码转换为unicode编码。

然后在`m本人n`函数中调用该函数,并输出结果。

5. 总结通过本文的介绍,读者可以了解到如何使用C语言来编写一个将utf-8编码转换为中文字符的程序。

CC++ 字符编码的转换(ut8、gb2312)

CC++ 字符编码的转换(ut8、gb2312)

C/C++ 字符编码的转换(ut8、gb2312)//这是个类strCoding (strCoding.h文件)#pragma once#include <iostream>#include <string>#include <windows.h>using namespace std;class strCoding{public:strCoding(void);~strCoding(void);void UTF_8ToGB2312(string &pOut, char *pText, int pLen);//utf_8转为gb231 2void GB2312ToUTF_8(string& pOut,char *pText, int pLen); //gb2312 转utf_8string UrlGB2312(char * str); //urlgb2312编码string UrlUTF8(char * str); //urlutf8 编码string UrlUTF8Decode(string str); //urlutf8解码string UrlGB2312Decode(string str); //urlgb2312解码private:void Gb2312ToUnicode(WCHAR* pOut,char *gbBuffer);void UTF_8ToUnicode(WCHAR* pOut,char *pText);void UnicodeToUTF_8(char* pOut,WCHAR* pText);void UnicodeToGB2312(char* pOut,WCHAR uData);char CharToInt(char ch);char StrToBin(char *str);//这是个类strCoding (strCoding.cpp文件)#include "StdAfx.h"#include ".\strcoding.h"strCoding::strCoding(void){}strCoding::~strCoding(void){}void strCoding::Gb2312ToUnicode(WCHAR* pOut,char *gbBuffer){::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1);return;}void strCoding::UTF_8ToUnicode(WCHAR* pOut,char *pText){char* uchar = (char *)pOut;uchar[1] = ((pText[0] & 0x0F) << 4) + ((pText[1] >> 2) & 0x0F);uchar[0] = ((pText[1] & 0x03) << 6) + (pText[2] & 0x3F);return;}void strCoding::UnicodeToUTF_8(char* pOut,WCHAR* pText){// 注意 WCHAR高低字的顺序,低字节在前,高字节在后char* pchar = (char *)pText;pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));pOut[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6);pOut[2] = (0x80 | (pchar[0] & 0x3F));return;}void strCoding::UnicodeToGB2312(char* pOut,WCHAR uData){WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(WCHAR),NULL,NUL L);return;}//做为解Url使用char strCoding:: CharToInt(char ch){if(ch>='0' && ch<='9')return (char)(ch-'0');if(ch>='a' && ch<='f')return (char)(ch-'a'+10);if(ch>='A' && ch<='F')return (char)(ch-'A'+10);return -1;}char strCoding::StrToBin(char *str){char tempWord[2];char chn;tempWord[0] = CharToInt(str[0]); //make the B to 11 -- 00001011tempWord[1] = CharToInt(str[1]); //make the 0 to 0 -- 00000000chn = (tempWord[0] << 4) | tempWord[1]; //to change the B O to 10110000return chn;}//UTF_8 转gb2312void strCoding::UTF_8ToGB2312(string &pOut, char *pText, int pLen){char buf[4];char* rst = new char[pLen + (pLen >> 2) + 2];memset(buf,0,4);memset(rst,0,pLen + (pLen >> 2) + 2);int i =0;int j = 0;while(i < pLen){if(*(pText + i) >= 0){rst[j++] = pText[i++];}else{WCHAR Wtemp;UTF_8ToUnicode(&Wtemp,pText + i);UnicodeToGB2312(buf,Wtemp);unsigned short int tmp = 0;tmp = rst[j] = buf[0];tmp = rst[j+1] = buf[1];tmp = rst[j+2] = buf[2];//newBuf[j] = Ctemp[0];//newBuf[j + 1] = Ctemp[1];i += 3;j += 2;}}rst[j]='\0';pOut = rst;delete []rst;}//GB2312 转为 UTF-8void strCoding::GB2312ToUTF_8(string& pOut,char *pText, int pLen) {char buf[4];memset(buf,0,4);pOut.clear();int i = 0;while(i < pLen){//如果是英文直接复制就可以if( pText[i] >= 0){char asciistr[2]={0};asciistr[0] = (pText[i++]);pOut.append(asciistr);}else{WCHAR pbuffer;Gb2312ToUnicode(&pbuffer,pText+i);UnicodeToUTF_8(buf,&pbuffer);pOut.append(buf);i += 2;}}return;}//把str编码为网页中的 GB2312 url encode ,英文不变,汉字双字节如%3D%AE%88string strCoding::UrlGB2312(char * str){string dd;size_t len = strlen(str);for (size_t i=0;i<len;i++){if(isalnum((BYTE)str[i])){char tempbuff[2];sprintf(tempbuff,"%c",str[i]);dd.append(tempbuff);}else if (isspace((BYTE)str[i])){dd.append("+");}else{char tempbuff[4];sprintf(tempbuff,"%%%X%X",((BYTE*)str)[i] >>4,((BYTE*)str)[i] %1 6);dd.append(tempbuff);}}return dd;}//把str编码为网页中的 UTF-8 url encode ,英文不变,汉字三字节如%3D%AE%88string strCoding::UrlUTF8(char * str){string tt;string dd;GB2312ToUTF_8(tt,str,(int)strlen(str));size_t len=tt.length();for (size_t i=0;i<len;i++){if(isalnum((BYTE)tt.at(i))){char tempbuff[2]={0};sprintf(tempbuff,"%c",(BYTE)tt.at(i));dd.append(tempbuff);}else if (isspace((BYTE)tt.at(i))){dd.append("+");}else{char tempbuff[4];sprintf(tempbuff,"%%%X%X",((BYTE)tt.at(i)) >>4,((BYTE)tt.at(i)) %1 6);dd.append(tempbuff);}}return dd;//把url GB2312解码string strCoding::UrlGB2312Decode(string str) {string output="";char tmp[2];int i=0,idx=0,ndx,len=str.length();while(i<len){if(str[i]=='%'){tmp[0]=str[i+1];tmp[1]=str[i+2];output += StrToBin(tmp);i=i+3;}else if(str[i]=='+'){output+=' ';i++;}else{output+=str[i];i++;}}return output;}//把url utf8解码string strCoding::UrlUTF8Decode(string str) {string output="";string temp =UrlGB2312Decode(str);//UTF_8ToGB2312(output,(char *)temp.data(),strlen(temp.data()));return output;}//test#include "stdafx.h"#include "strCoding.h"using namespace std;int main(){strCoding cfm;string keyword="大家好,欢迎你";string Temp="";string Output="";//把关键字做url的utf8编码Temp= cfm.UrlUTF8((char *)keyword.data());cout<<Temp<<endl;//把url的utf8编码的结果解码Temp =cfm.UrlUTF8Decode(Temp);cout<<Temp<<endl;//把关键字做url的gb2312编码Temp =cfm.UrlGB2312((char *)keyword.data());cout<<Temp<<endl;//把url的gb2312编码的结果解码Temp =cfm.UrlGB2312Decode(Temp);cout<<Temp<<endl;//把关键字GB2312转UTF_8cfm.GB2312ToUTF_8(Output,(char *)keyword.data(),strlen(keyword.data ()));cout<<Output<<endl;//把GB2312转UTF_8转为中文cfm.UTF_8ToGB2312(Temp,(char *)Output.data(),strlen(Output.data()));cout<<Temp<<endl;//system("pasue");getchar();return 0;//}在VC7win32下调试通过。

c语言字符串替换算法

c语言字符串替换算法

c语言字符串替换算法下面是一份关于C语言字符串替换算法的文章,详细介绍了如何使用不同的方法来实现字符串替换。

文章分为多个步骤,通过逐步回答问题的方式帮助读者了解和应用这些算法。

C语言字符串替换算法在C语言编程中,经常需要对字符串进行各种操作,其中之一就是字符串的替换。

字符串替换是将字符串中特定的一个或多个子串替换为其他内容。

在本篇文章中,我们将一步一步介绍如何使用C语言实现字符串替换算法。

步骤一:了解基本概念在开始编写代码之前,我们需要了解一些基本概念。

首先是字符串的表示形式。

在C语言中,字符串是由一系列字符组成的字符数组,以空字符('\0')结尾。

例如,"Hello World"可以表示为字符数组['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '\0']。

另一个重要的概念是子串。

子串是指字符串中的一个连续的部分。

例如,在字符串"Hello World"中,"World"是一个子串。

步骤二:使用库函数实现字符串替换C语言提供了一些库函数来处理字符串操作,其中之一就是str_replace()函数。

该函数可以将字符串中的一个子串替换为给定的内容。

以下是str_replace()函数的使用示例:cinclude <stdio.h>include <string.h>char *str_replace(const char *original, const char *pattern, const char *replacement) {获取原始字符串中的第一个子串的位置char *substring = strstr(original, pattern);if (substring == NULL) {如果没有找到子串,直接返回原始字符串return strdup(original);}计算替换后的字符串的长度int len = strlen(original) - strlen(pattern) +strlen(replacement);创建存储替换后字符串的内存空间char *result = (char *)malloc(len + 1);memset(result, '\0', len + 1);复制替换前的子串之前的内容到结果字符串中strncpy(result, original, substring - original);复制替换后的内容到结果字符串中strcat(result, replacement);复制替换前的子串之后的内容到结果字符串中strcat(result, substring + strlen(pattern));return result;}int main() {char original[] = "Hello World";char pattern[] = "World";char replacement[] = "C";char *result = str_replace(original, pattern, replacement);printf("Result: s\n", result);free(result);return 0;}步骤三:自定义实现字符串替换算法除了使用库函数,我们还可以自己编写代码来实现字符串替换算法。

C#汉字Unicode编码相互转换

C#汉字Unicode编码相互转换

C#汉字Unicode编码相互转换C#汉字Unicode编码相互转换Unicode和汉字编码⼩知识将汉字进⼩UNICODE编码,如:“王”编码后就成了“\\王”,UNICODE字符以\\u开始,后⼩有4个数字或者字母,所有字符都是16进制的数字,每两位表⼩的256以内的⼩个数字。

⼩⼩个汉字是由两个字符组成,于是就很容易理解了,“738b”是两个字符,分别是“73”“8b”。

但是在将UNICODE字符编码的内容转换为汉字的时候,字符是从后⼩向前处理的,所以,需要把字符按照顺序“8b”“73”进⼩组合得到汉字。

下⼩是C#汉字Unicode编码相互转换代码。

using System;using System.Text;using System.Text.RegularExpressions;using System.Globalization;public class GB2312UnicodeConverter{///<summary>///汉字转换为Unicode编码///</summary>///<param name="str">要编码的汉字字符串</param>///<returns>Unicode编码的的字符串</returns>public static string ToUnicode(string str){byte[] bts = Encoding.Unicode.GetBytes(str);string r = "";for (int i = 0; i < bts.Length; i += 2) r += "\\\\u" + bts[i + 1].ToString("x").PadLeft(2, '0') + bts[i].ToString("x").PadLeft(2, '0');return r;}///<summary>///将Unicode编码转换为汉字字符串///</summary>///<param name="str">Unicode编码字符串</param>///<returns>汉字字符串</returns>public static string ToGB2312(string str){string r = "";MatchCollection mc = Regex.Matches(str, @"\\\\u([\\w]{2})([\\w]{2})", piled | RegexOptions.IgnoreCase);byte[] bts = new byte[2];foreach(Match m in mc ){bts[0] = (byte)int.Parse(m.Groups[2].Value, NumberStyles.HexNumber);bts[1] = (byte)int.Parse(m.Groups[1].Value, NumberStyles.HexNumber);r += Encoding.Unicode.GetString(bts);}return r;}}。

中文字符串的编码转换(c实现)

中文字符串的编码转换(c实现)

中⽂字符串的编码转换(c实现)中⽂字符串在c/c++中表⽰为字节序列,在分词的时候需要根据不同的编码⽅式进⾏分词,⼀般分词器需要转换成统⼀的编码⽅式再进⾏转换,有些分词器如ICTCLAS在分词的时候可以不显⽰定义编码⽅式,可以检测字符串的编码⽅式再进⾏转换,本⽂就项⽬中⽤到的⼏种编码转换⽅式进⾏总结,主要利⽤了iconv进⾏编码转换。

size_t inlen, char* outbuf){ iconv_t cd =iconv_open( "UTF-16LE//IGNORE", "GBK");bzero( outbuf, inlen*4);char *in = inbuf; char *out= outbuf; size_t outlen =inlen*4; iconv(cd, &in,(size_t *)&inlen,&out,&outlen); if(outlen>=sizeof(bchar_t) )*((bchar_t *) out) = L'\0';iconv_close(cd); } voidutf16le_gbk(char* inbuf,size_t inlen, char* outbuf){ iconv_t cd =iconv_open("GBK//IGNORE", "UTF-16LE"); bzero( outbuf,inlen*4); char *in = inbuf;char *out = outbuf; size_toutlen = inlen*4;iconv(cd, &in, (size_t*)&inlen, &out,&outlen);if( outlen>=sizeof(char) )*((char *) out) = '\0';iconv_close(cd); } voidutf16le_utf8(char* inbuf,size_t inlen, char* outbuf){ iconv_t cd =iconv_open( "UTF-8//IGNORE", "UTF-16LE"); bzero( outbuf,inlen*4); char *in = inbuf;char *out = outbuf; size_toutlen = inlen*4;iconv(cd, &in, (size_t*)&inlen, &out,&outlen);if( outlen>=sizeof(char) )*((char *) out) = '\0';iconv_close(cd); } voidgbk_utf16le(char* inbuf,size_t inlen, char*outbuf,uint32_t&outbuflen) { iconv_t cd =iconv_open( "UTF-16LE//IGNORE", "GBK");bzero( outbuf, inlen*4);char *in = inbuf; char *out= outbuf; size_t outlen =inlen*4; outbuflen =outlen; iconv(cd, &in,(size_t *)&inlen,&out,&outlen); //outlen isbytes of outbuf not usedoutbuflen -= outlen; if(outlen>=sizeof(bchar_t) )。

VC将UTF8字符串转换为gb2312

VC将UTF8字符串转换为gb2312

VC将UTF8字符串转换为gb2312//将UTF8字符串转换为gb2312CString ConvertUTF8toGB2312(const char *pData, size_t size) {size_t n = MultiByteToWideChar(CP_UTF8, 0, pData, (int)size, NULL, 0);WCHAR * pChar = new WCHAR[n+1];n = MultiByteT oWideChar(CP_UTF8, 0, pData, (int)size, pChar, n);pChar[n]=0;n = WideCharToMultiByte(936, 0, pChar, -1, 0, 0, 0, 0);char *p = new char[n+1];n = WideCharToMultiByte(936, 0, pChar, -1, p, (int)n, 0, 0);CString result(p);delete []pChar;delete []p;return result;}void CDialogT estDlg::OnBnClickedOk(){USES_CONVERSION;// TODO: 在此添加控件通知处理程序代码CInternetSession session;CHttpFile *file = NULL;CString strURL = _T("/doc/d8*******.html,");CString strHtml = _T(""); //存放网页数据try{file = (CHttpFile*)session.OpenURL(strURL);}catch(CInternetException * m_pException){file = NULL;m_pException->m_dwError;m_pException->Delete();session.Close();AfxMessageBox(_T("CInternetException"));}CString strLine;char sRecived[1024];if(file != NULL){while(file->ReadString((LPTSTR)sRecived,1024) != NULL){strHtml += sRecived;}char *pChar=W2A(strHtml.GetBuffer());CString x=ConvertUTF8toGB2312(pChar,strlen(pChar));//这里进行了转换}else{AfxMessageBox(_T("fail"));}session.Close();file->Close();delete file;file = NULL;}//对付GB2312的页面CInternetSession session;CHttpFile *file = NULL;CString strURL = _T("/doc/d8*******.html,");CString strHtml = _T(""); //存放网页数据try{file = (CHttpFile*)session.OpenURL(strURL);}catch(CInternetException * m_pException){file = NULL;m_pException->m_dwError;m_pException->Delete();session.Close();AfxMessageBox(_T("CInternetException"));}CString strLine;char sRecived[1024];if(file != NULL){while(file->ReadString((LPTSTR)sRecived,1024) != NULL) {strHtml += sRecived;}}else{AfxMessageBox(_T("fail"));}session.Close();file->Close();delete file;file = NULL;。

C语言实现Base64编码转码

C语言实现Base64编码转码

C语⾔实现Base64编码转码关于Base64的介绍有两篇⽂章已经做得⾮常好了:⼀篇是,如果被Q可以看本⽂ ;另⼀篇是阮⼀峰的.说⼀说C语⾔的实现吧,其实维基百科给出了C语⾔的实现了,但是它⽤以处理File,当然原理都是⼀样的,File的处理其实可以放在外⾯做好.另外,根据Base64介绍可以看出来它以6⽐特为⼀个单元,⽽常规1字节为8⽐特,所以Base64编码的核⼼其实是位操作的过程.好了,可以放代码了:static const char *ALPHA_BASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";char *encode(const char *buf, const long size, char *base64Char) {int a = 0;int i = 0;while (i < size) {char b0 = buf[i++];char b1 = (i < size) ? buf[i++] : 0;char b2 = (i < size) ? buf[i++] : 0;int int63 = 0x3F; // 00111111int int255 = 0xFF; // 11111111base64Char[a++] = ALPHA_BASE[(b0 >> 2) & int63];base64Char[a++] = ALPHA_BASE[((b0 << 4) | ((b1 & int255) >> 4)) & int63];base64Char[a++] = ALPHA_BASE[((b1 << 2) | ((b2 & int255) >> 6)) & int63];base64Char[a++] = ALPHA_BASE[b2 & int63];}switch (size % 3) {case 1:base64Char[--a] = '=';case 2:base64Char[--a] = '=';}return base64Char;}char *decode(const char *base64Char, const long base64CharSize, char *originChar, long originCharSize) {int toInt[128] = {-1};for (int i = 0; i < 64; i++) {toInt[ALPHA_BASE[i]] = i;}int int255 = 0xFF;int index = 0;for (int i = 0; i < base64CharSize; i += 4) {int c0 = toInt[base64Char[i]];int c1 = toInt[base64Char[i + 1]];originChar[index++] = (((c0 << 2) | (c1 >> 4)) & int255);if (index >= originCharSize) {return originChar;}int c2 = toInt[base64Char[i + 2]];originChar[index++] = (((c1 << 4) | (c2 >> 2)) & int255);if (index >= originCharSize) {return originChar;}int c3 = toInt[base64Char[i + 3]];originChar[index++] = (((c2 << 6) | c3) & int255);}return originChar;}在调⽤的时候⼀定要注意malloc的⼤⼩.这个Base64其实我们经常在⽤,只是没有留意⽽已.⽐如P2P下载⼯具*雷就⽤Base64编码了很多资源,我这⾥找了⼀个电影<独⽴⽇:卷⼟重来.BD1280⾼清国英双语特效中英双字>下载链接是这样的: thu*der://QUFlZDJrOi8vfGZpbGV8JUU3JThCJUFDJUU3JUFCJThCJUU2JTk3JUE1JUVGJUJDJTlBJUU1JThEJUI3JUU1JTlDJTlGJUU5JTg3JThEJUU2JTlEJUE1LkJEMTI4MCVFOSVBQiU5OC 似挺聪明的做法,⾃定义了协议头,后⾯⼀⼤串晕晕乎乎的不知道是什么东西,⼀般的资源都是带⽂件名⾄少能看到后缀名啥的,不过看到最后⼜两个 '=' 字符,这个就很明显是这边⽂章的主题Base64,在看这⾥⾯的字符都在Base64定义的字符内就可以认定这个是Base64编码后的链接.如果你恰好没装*雷,也不想装*雷(这货会偷偷上传⽂件,别问我怎么知道的,亲⼿抓到的),就可以把协议头后⾯的⼀⼤串字符串拷贝出来,decode⼀下可以得到 AAed2k://|file|%E7%8B%AC%E7%AB%8B%E6%97%A5%EF%BC%9A%E5%8D%B7%E5%9C%9F%E9%87%8D%E6%9D%A5.BD1280%E9%AB%98%E6%B8%85%E5%9B%BD%E8%8B%B1掉 AA 剩下 ed2k://|file|%E7%8B%AC%E7%AB%8B%E6%97%A5%EF%BC%9A%E5%8D%B7%E5%9C%9F%E9%87%8D%E6%9D%A5.BD1280%E9%AB%98%E6%B8%85%E5%9B%BD%E8%8B%B1%E 下认得了吧.⽤想⽤的下载⼯具下载吧.当然也可以⽤在线的base64 转码⼯具.以下内容摘⾃维基百科Base64是⼀种基于64个可打印字符来表⽰⼆进制数据的表⽰⽅法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C++编译器对字符串的编码转换
殷海峰
2012年07月20日
变更记录
日期作者说明2012.07.18 殷海峰完成初稿
2012.07.20 殷海峰增加了如下内容
1、研究方法;
2、MinGW gcc 处理 Unicode 字符串;
3、VC++6.0处理rc文件里的字符串;
4、VC++.NET对字符串的处理
I
目录
第1章说明 (3)
1.1 前言 (3)
1.2 MinGW gcc (3)
1.2.1 ANSI字符串 (3)
1.2.2 Unicode字符串 (4)
1.2.3 #include (4)
1.3 VC++6.0 (4)
1.3.1 ANSI字符串 (5)
1.3.2 Unicode字符串 (5)
1.3.3 资源文件 (5)
1.4 VC++.NET (5)
II
第1章说明
1.1 前言
本文将研究C++编译器对字符串的编码转换。

如下面两行代码包含了一个ANSI字符串和一个Unicode字符串(也叫Wide字符串)。

编译之后,它们具体的编码是什么?
const char* pA = "123456789测试"; //ANSI字符串
const wchar_t* pW = L"123456789测试"; //Unicode字符串
使用UltraEdit以二进制打开编译生成的exe文件。

找到123456789之后就可以查看ANSI字符串中“测试”的编码;找到16进制字符串 31 00 32 00 33 00 34 00 35 00就可以查看Unicode字符串中“测试”的编码。

使用这个方法,本文对 MinGW gcc 和 VC++ 编译器进行了研究。

1.2 MinGW gcc
在 Windows 系统下,安装Qt Creator 2.3.1 之后,MinGW 4.4.0就被自动安装,其安装目录一般位于:C:\Qt\qtcreator-2.3.1\mingw。

1.2.1 ANSI字符串
MinGW gcc 4.4.0编译器对ANSI字符串的编码原则:保持其在源文件里的原始编码,不做任何转换。

举例说明:对于Test.cpp里的字符串"测试"。

如果Test.cpp的编码是ANSI 的,则"测试"就是ANSI编码;如果Test.cpp的编码是UTF-8的,则"测试"就是UTF-8编码。

编译器生成exe的时候,仅仅在它们后面增加一个字符'\0'。

也就是说同样的字符串"测试",会因为Test.cpp的编码不同而不同。

同样的代码s trlen("测试"),会因为Test.cpp的编码不同而返回不同的值。

了解了这个原理,下面来看两行QT代码:
3
QTextCodec::setCodecForTr(QTextCodec::codecForName("System"));
QString s = QObject::tr("测试");
先说说第2行代码,它将一个字符串转换为QString对象,而QString其实是一个 Unicode 字符串(每个字符占2个字节)。

再说说第1行代码,它指定了QObject::tr转换字符串时所使用的代码页。

对于中文操作系统,可以将System替换为GBK或GB2312。

假如这段代码所在文件以ANSI编码保存,则"测试"的编码就是ANSI的,上面两行代码可以正常运行;假如这段代码所在文件以UTF-8编码保存,则"测试"的编码是UTF-8的,QObject::tr硬要把这个UTF-8字符串当做ANSI字符串转换为Unicode字符串,其结果必然是乱码。

所以QTextCodec::setCodecForTr(QTextCodec::codecForName("System"));指定的是字符串所在文件的代码页。

如:所有的h、cpp文件以UTF-8编码保存,则应指定代码页为UTF-8,否则就会出现乱码。

1.2.2 Unicode字符串
不要奇怪,MinGW gcc也支持Unicode字符串。

编译器需要将Unicode字符串编码转换为2字节的Unicode编码(在Windows下,低位在前高位在后)。

举例说明:对于Test.cpp里的字符串L"测试"。

如果Test.cpp的编码是UT F-8的,则编译后的编码是Unicode的;如果Test.cpp的编码是ANSI的,则编译的时候会出错。

也就是说:在MinGW gcc里使用Unicode字符串,则源文件必须是UTF-8编码。

1.2.3 #include
假定字符串"测试"在Test.h里,Test.cpp包含了这个头文件。

Test.h的编码是ANSI的,而Test.cpp的编码是UTF-8的,那么编译之后,"测试"的编码是ANSI的,还是UTF-8的?答案是ANSI的,即保持字符串最原始的编码。

1.3 VC++6.0
4
1.3.1 ANSI字符串
VC++6.0的源文件必须是ANSI编码的,编译的时候对ANSI字符串是不做任何编码转换的。

1.3.2 Unicode字符串
VC++6.0对Unicode字符串会进行编码转换,转换的时候采用的是系统的代码页。

如:在简体中文操作系统下,对于L"测试",VC++6.0编译器会将"测试"(ANSI字符串)由代码页936转换为Unicode;同样的代码,在繁体中文操作系统下,对于L"测试",VC++6.0编译器会将"测试"(ANSI字符串)由代码页950转换为Unicode。

如果一个软件用到了多种语言,如:CHS.cpp里有简体中文的Unicode字符串;CHT.cpp里有繁体中文的Unicode字符串。

此时,完全采用系统的代码页转换字符串显然会出错。

那该怎么办呢?答案是使用预编译指令#pragma set locale。

请在CHS.cpp里增加#pragma setlocale(".936"),指定代码页为936;请在CHT.cpp里增加#pragma setlocale(".950"),指定代码页为950。

只要系统安装了代码页936和950,那么所有的L""字符串就能被正确的编译。

1.3.3 资源文件
编译rc文件和编译cpp文件的编译程序是不相同的。

rc文件的编译由资源编译器完成,它会将所有的字符串由ANSI编码转换为Unicode编码,预处理指令#pragma code_page 会指定字符串的代码页。

1.4 VC++.NET
从VC++.NET 2002开始,VC++允许源代码文件有多种编码,如:ANSI、UTF-8、Unicode……不过预编译的时候,会将整个文件转换为ANSI编码,然后再继续编译。

也就是说VC++.NET支持的多种编码只是编辑器的表面支持,实际编译的时候还是编译ANSI编码的源文件。

这样有时就会有问题:假定在某个UTF-8编码的cpp文件里,有简体中文字符串,还有繁体中文
5
字符串。

编译的时候,预编译器会把这个文件转换为ANSI编码。

如果在简体中文操作系统下,繁体中文字符串的编码会出错;如果在繁体中文操作系统下,简体中文字符串的编码会出错。

6。

相关文档
最新文档