一、简介
在VC开发中我们经常遇到字节转换的问题,因为现在开发基本都要用到Unicode,而C的函数都是ANSIC码的,如果我们在VC开发中需要用到C的函数就必须要处理这个问题,ANSIC码是单字节的,而Unicode是双字节的,本质上市单双字节的转换。
二、ANSIC
不同的国家和地区制定了不同的标准,由此产生了 GB2312、GBK、Big5、Shift_JIS 等各自的编码标准。这些使用 1 至 4 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文Windows操作系统中,ANSI 编码代表 GBK 编码;在日文Windows操作系统中,ANSI 编码代表 Shift_JIS 编码。 不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。
三、Unicode
Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。
四、字节转换
1.双字节转单字节,用WideCharToMultiByte();
#include <iostream>
using namespace std;
#include <atlstr.h>
int main()
{
CString str = L"liuxijiao计算机网络";
int n = str.GetLength(); //获取str的字符数
int len = WideCharToMultiByte(CP_ACP, 0, str, n, NULL, 0, NULL, NULL); //获取宽字节字符的大小,大小是按字节计算的
char *pChar = new char[len + 1]; //以字节为单位
WideCharToMultiByte(CP_ACP, 0, str, n, pChar, len, NULL, NULL); //宽字节编码转换成多字节编码
pChar[len + 1] = '\0'; //多字节字符以'\0'结束
cout<<pChar<<endl;
delete[] pChar;
return 0;
}
运行结果:
liuxijiao计算机网络
2.单字节转双字节:
MultiByteToWideChar()
#include <iostream>
using namespace std;
#include <atlstr.h>
#include <stdio.h>
#include <string.h>
int main()
{
//将char数组转换为wchar_t数组
char *pChar = "liuxijiao计算机网络";
int charLen = strlen(pChar); //计算pChar所指向的字符串大小,以字节为单位,一个汉字占两个字节
int len = MultiByteToWideChar(CP_ACP, 0, pChar, charLen, NULL, 0); //计算多字节字符的大小,按字符计算
wchar_t *pWChar = new wchar_t[len + 1]; //为宽字节字符数申请空间,
MultiByteToWideChar(CP_ACP, 0, pChar, charLen, pWChar, len); //多字节编码转换成宽字节编码
pWChar[len] = '\0';
//将wchar_t数组转换为CString
CString str;
str.Append(pWChar);
delete[] pChar;
delete[] pWChar;
return 0;
}
运行结果:
liuxijiao计算机网络