C++常用字符编码简介

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如果你希望你的程序能支持到 GB18030,那么就去找 GB18030 的规范来看看
网上有很多判断汉字的说法,你只要记住,你要支持的编码是哪个? GB2312、GBK、GB18030?每个编码有自己的编码范围或者规范,网上之所以有不同的说法,正是因 为他们互相说的不是同一种编码方式我这里说的是 GB2312 的编码,如果你的程序要编译成支持 UNICODE 的话,那么这段代码就要修改成对应 UNICODE 规范的代码了
if (sqChar[0]==0xa3) return 1;//全角字符
else return 2;//汉字
else return 0;//英文数字英文标点
}
三、附简单的测试汉字全角字符英文的程序
//test.c //源代码作者:夏克 //新建 Win32 Application 工程,把 test.c 加入,运行,试着修改 szText 的值,来观察代码效果
#include <windows.h>
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {
case 2: pText++; pText++; MessageBox (NULL, TEXT ("发现汉字"), TEXT ("Hello"), 0); break;
} }
return 0 ; }
int IsGB(PTSTR pText) {
unsigned char sqChar[20]; sqChar[0]=*pText; if (sqChar[0]>=0xa1)
static TCHAR szText[] = {TEXT ("i 服,了 u y")} ; PTSTR pText; int i; unsigned char sqChar[20];
pText=szText; while (*pText != '\0') {
i=IsGB(pText);
switcwenku.baidu.com(i) {
一、三种字符简介(ASCII, DBCS, UNICODE)
• ASCII 只支持英文,全部为 8 位 • DBCS 支持英文和中文,但中文需要两个字节(16 位),不是等宽的 • UNICODE 支持英文和中文,英文和中文都需要两个字节
ASCII 是 DOS 时代的,无法支持中文。DBCS 是 Win9x 支持的字符集。UNICODE 是 win2k 和 xp 支持的字符集。而汉字的编码目前有 GB2312-1980 和 GB18030-2000,GB2312 就是 DBCS 类型的 汉字编码,GB18030 就是 UNICODE 的汉字编码,当然 GB18030 兼容 GB2312,也就是说 GB18030 也 支持 DBCS 的字符处理方式。虽然 GB18030 是 2000 年后强制执行的国家标准,但目前使用最多的还是 GB2312 编码,而且 GB2312 也足够处理你所用到的汉字了,还有 GBK 编码是 GB2312 的增强版
这里我仅支持 GB2312 由于 GB2312 是中国大陆制定的标准,所以繁体中文并不在 GB2312 的编 码中,如果你的程序需要支持繁体中文,则还需要处理 Big5 编码其实也很简单。
二、常用字符编码的实际类型
下面说一下在 C 中如何处理 GB2312 编码的汉字以 VC6.0 为例,如果声明变量的类型为 wchar_t 则是 UNICODE 编码,如果是 char 则是 DBCS 编码。比如我的一个函数声明是: void Justify (HDC hdc, PTSTR pText, RECT * prc, int iAlign) 其中的 pText 是 PTSTR 类型,PTSTR 在 WINNT.H 中有两个定义(WINNT.H 中的这段代码我删掉了中 间无关的部分) #ifdef UNICODE typedef LPWSTR PTSTR, LPTSTR;//如果是 UNICODE 编码,则定义 PTSTR 为 LPWSTR 类型 #else typedef LPSTR PTSTR, LPTSTR;//如果是不是 UNICODE 编码,则定义 PTSTR 为 LPSTR 类型 #endif
• LPSTR 定义为 CHAR 的指针
• LPSWSTR 定义为 WCHAR 的指针
• CHAR 定义为 char 类型
• WCHAR 定义为 wchar_t 类型
• wchar_t 定义为 unsigned short 类型,它是 16 位,两个字节,无符号短整数
是 UNICODE 还是非 UNICODE 取决于你的编译选项,如果在[工程]-[选项]-[C/C++]的[预处理程 序定义]中填入了_UNICODE,那么程序会用 wchar_t 指针来定义 LPSTR,如果没有_UNICODE,那么程 序会用 char 指针来定义 LPSTR,这样带来的区别就是,你接受到的 pText 中的字节内容是不一样的,[i 服了 you]这个字串如果在没有定义_UNICODE 的情况下,是 8 个字节,而在定义了_UNICODE 的情况下 是 12 个字节。反映到程序中就是,如果没有定义_UNICODE,那么就要把英文字符当成 1 个字节来处 理,而汉字字符的编码是采用 GB2312 编码规范来的一个汉字 2 个字节;如果定义了_UNICODE,那么 英文字符要当成 2 个字节来处理,而汉字字符的编码是采用 UNICODE 编码来的,一个汉字还是 2 个字 节,只是和英文是登长的。举例来说,win98 不采用 UNICODE 编码而采用的是 DBCS 编码,为了让我 的程序既可以在 XP 下运行又可以在 Win98 下运行,我没有定义_UNICODE 这样我的程序代码就要把字 符串当成 DBCS 编码来处理,也就是英文字符是 1 个字节,中文字符是 2 个字节,中文编码采用 GB2312 编码用 Justify 来说明: 我给 pText 传递来[你]这个汉字,那么 pText 应该有两个字节来存放[你]这个字,设置段点来读一下 pText 的内容 void Justify (HDC hdc, PTSTR pText, RECT * prc, int iAlign) {
static TCHAR szText[] = {TEXT ("你")} ;
pText=szText; } 设断调试会发现*pText=-60,怎么会这样呢,原因是没有按 unsigned char 来转换*pText 的值,修改代
码如下: void Justify (HDC hdc, PTSTR pText, RECT * prc, int iAlign) {
常用字符编码简介
(char,CHAR,WCHAR,WARCHAR,LPSTR,LPSWSTR,UNICODE,)
一、三种字符简介(ASCII, DBCS, UNICODE)..................................................................................2 二、常用字符编码的实际类型............................................................................................................. 3 三、附简单的测试汉字全角字符英文的程序.....................................................................................5
case 0: pText++; MessageBox (NULL, TEXT ("发现数字英文字符或英文标点"), TEXT
("Hello"), 0); break;
case 1: pText++; pText++; MessageBox (NULL, TEXT ("发现全角字符"), TEXT ("Hello"), 0); break;
static TCHAR szText[] = {TEXT ("你")} ; unsigned char sqChar[20];//这个变量就是为了强制转换类型用的
pText=szText; sqChar[0]=*pText; sqChar[1]=*(pText+1); } 这时下断查看 sqChar[0]=196,sqChar[1]=227 就对了,为什么呢,因为它和 GB2312 的编码是一样的 GB2312-80 编码的编码范围是高位 0xa1-0xfe,低位是 0xa1-0xfe ,其中汉字范围为 0xb0a1 和 0xf7fe,如果只是简单地判断汉字,则只要查看高字节是否大于等于 0xa1 就可以了,还有就是,全角字 符的高字节统统等于 0xa3,所以很容易可以区别出全角字符来
相关文档
最新文档