字符编码之间的转换

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

投稿:shichen2014 字体:[增加 减小] 类型:转载 时间:2014-07-21

这篇文章主要介绍了VC中实现GB2312、BIG5、Unicode编码转换的方法,该功能非常实用,需要的朋友可以参考下

本文主要以实例形式讨论了VC编译环境下,实现字符串和文件编码方式转换的方法,在linux下请使用Strconv来实现。具体方法如下:

一、文件编码格式转换

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

//GB2312 编码文件转换成 Unicode:

if((file_handle = fopen(filenam,"rb")) != NULL)

{

    //从GB2312源文件以二进制的方式读取buffer

    numread = fread(str_buf_pool,sizeof(char),POOL_BUFF_SIZE,file_handle);

    fclose(file_handle);

   //GB2312文件buffer转换成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编码文件文件头标示符"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);

   }

}

二、字符串编码格式转换

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

//GB2312 转换成 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 转换成 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 转换成 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 转换成 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 转换成 简体中文 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 转换成 繁体中文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 函数:MultiByteToWideChar参数说明

第一个参数为代码页, 用 GetLocaleInfo 函数获取当前系统的代码页,936: 简体中文, 950: 繁体中文
第二个参数为选项,一般用
0 就可以了
第三个参数为 ANSI 字符串的地址, 这个字符串是第一个参数指定的语言的 ANSI 字符串 (AnsiString)
第四个参数为
ANSI 字符串的长度,如果用 -1, 就表示是用 0 作为结束符的字符串
第五个参数为转化生成的 unicode 字符串 (WideString)
的地址, 如果为 NULL, 就是代表计算生成的字符串的长度
第六个参数为转化生成的 unicode 字符串缓存的容量,也就是有多少个UNICODE字符

复制自http://www.jb51.net/article/52477.htm

时间: 2024-10-09 04:44:29

字符编码之间的转换的相关文章

Delphi字符串、PChar与字符数组之间的转换

来自:http://my.oschina.net/kavensu/blog/193719 ----------------------------------------------------------------- var s: string; p: pchar; a: array[1..20] of char; 1.字符串 ---> PChar p := PChar(s); 2.PChar ---> 字符串 s := p; 3.PChar ---> 字符数组 StrCopy(@a

《Python CookBook2》 第一章 文本 - 每次处理一个字符 && 字符和字符值之间的转换

文本 - 总结: 什么是文本Python 中的string 类型是不可变类型.文本,一个字符的矩阵,每一个单独的文本快可以被缩进和组织起来. 基本的文本操作①解析数据并将数据放入程序内部的结构中:②将数据以某种方式转化为另一种相似的形式,数据本身发生了改变:③生成全新的数据 每次处理一个字符: 任务用每次处理一个字符的方式处理字符串. 解决方案可以创建一个列表,列表的子项是字符串的字符.代码如下: >>> thelist = list('thestring') >>>

Python常见字符编码间的转换

学习Python,字符编码间的转换是绕不过去的一只拦路虎,不把编码彻底搞明白,总有一天它会猝不及防坑你一把. Python2.x和Python3.x在字符编码的设置上也有很大区别(Python3未来将是主流,所以Python3为主),今天我们就来一起学习下. 上一篇文章里我已经简述了Python的常见编码了,这里就不再赘述了,还不清楚的小伙伴可以先去看下:     http://www.cnblogs.com/schut/p/8406897.html 一.Unicode 和 UTF-8的纠葛 U

不同字符编码格式之间的转换

一.概述 为使计算机支持更多语言,通常使用 0x80~0xFF 范围的 2 个字节来表示 1 个字符.比如:汉字 '中' 在中文操作系统中,使用 [0xD6,0xD0] 这两个字节存储. 二.编码格式分类 1.ansi编码 不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准.这些使用2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码.在简体中文系统下,ANSI 编码 代表 GB2312 编码,在日文操作系统下,ANSI 编码代表

字符串和字符数组之间的转换

package String; /* * 写了一个字符串和字符数组之间转换的例子 * 总结:将字符串转变为字符数组 :public char[] toCharArray() * 直接将一个字符数组变成一个字符串 public String (char[] value) 这个是构造函数啊,可以直接new 并为属性赋值啊. */ public class StringDemo2 { public static void main(String[] args) { String s = "hellow

python-day3-内置函数与字符字节之间的转换

1 #三元运算 2 1 if True else 0 3 >>>1 4 5 1 if False else 0 6 >>>0 7 8 #内置函数lambda 9 def f1(a1): 10 return a1+100 11 ret=f1(10) 12 print(ret) 13 >>>110 14 #相当于 15 f2=lambda a1:a1+100 16 ret2=f2(10) 17 print(ret2) 18 >>>110

Pdf与Base64编码之间的转换

在我们的工作有时候我们需要将图片或者pdf文件转换为Base64编码,然后从服务器端下载传输到本地,在这里我列举下两者之间的转换方法: Base64编码转换为pdf: /** * Description: 将base64编码内容转换为Pdf * @param base64编码内容,文件的存储路径(含文件名) * @Author fuyuwei * Create Date: 2015年7月30日 上午9:40:23 */ public static void base64StringToPdf(S

c#汉字与编码之间的转换(输出十六进制)

/******************************************************************/ /*********************** ****************************/ /*********************** 汉字转换工具 ****************************/ /*********************** ****************************/ /********

python中的字符数字之间的转换函数

int(x [,base ])         将x转换为一个整数 long(x [,base ])        将x转换为一个长整数 float(x )               将x转换到一个浮点数 complex(real [,imag ])  创建一个复数 str(x )                 将对象 x 转换为字符串 repr(x )                将对象 x 转换为表达式字符串 eval(str )              用来计算在字符串中的有效Py