关闭

第2章学习笔记

1132人阅读 评论(0) 收藏 举报
Diyinside  Community Academy Course (Beta)

Windows API Course(2)

目标:
1,解释计算机字符的历史和发展
2,解释ASCII,Extending ASCII,Double-Byte Character和Unicode区别和联系。
3,解释在C语言环境下宽字符编程
4,解释在Win32环境下宽字符编程

学习内容:
阅读<Programming Windows,Fifth Edition> Chapter 2


Learning WIN32 API Homework By citypw(Shawn Chang)

1,解释计算机字符的历史和发展
最早的计算机编码是从Hollerith卡发展而来,它由Herman Hollerith在1890年在美国人口普查中使用.Binary-Coded Decimal Interchange Code是基于Hollerith编码扩充的8-bit编码,但只使用于IBM的大型机.ASCII初步定稿是50年代末期,并在1967年完成.最后定位26个小写字母和26个大写字母,10个数字,32个符号和33个控制代码和一个空格.一共128个.ASCII不能很好的支持非英语之外的字符,所以之后出现了扩展ASCII,它是8-bit的编码.

2,解释ASCII,Extending ASCII,Double-Byte Character和Unicode区别和联系。
ASCII是7-bit编码,提供128个代码.26个小写字母和26个大写字母,10个数字,32个符号和33个控制代码和一个空格.
Extending ASCII是8-bit编码,提供256个代码.主要为一些欧洲国家的语言和符号最了填充.

Double-Byte Character,提供256个代码,前128个和ASCII一样(为了和ASCII兼容),较高的字节由2个字节一起.

Unicode,是一个纯16-bit的系统,可以提供65536个字符,这样可以表达世界上所有的文字和符号.

3,解释在C语言环境下宽字符编程
宽字符的C语言编程需要头文件<wchar.h> 宽字符类型wchar_t.
以下是一个实例程序:

#include <iostream>
#include <wchar.h>
#include <string>
using namespace std;
int main()
{
    char *p="CityPW";
    wchar_t *wp=L"CityPW";
    char a[]="CityPW";     //自动加上1个字符 '/0'
    wchar_t wa[]=L"CityPW";  //自动加上2个字符'/0'
   
    int i=strlen(p);
    int wi=wcslen(wp);
   
    cout<<"char指针的大小"<<sizeof(p)<<endl;
    cout<<"wide-char指针的大小"<<sizeof(wp)<<endl;
    cout<<"char数组的大小"<<sizeof(a)<<endl;
    cout<<"wide-char数组的大小"<<sizeof(wa)<<endl;
    cout<<"char长度是:"<<i<<endl;
    cout<<"wchar_t长度是:"<<wi<<endl;
    return 0;
}
4,解释在Win32环境下宽字符编程
WINDOWS NT/2K/XP/2003都从底层上支持Unicode,但Windows 98对Unicode的支持少了很多.在WIN32平台下进行宽字符方式编程主要要明白当我们调用一些API例如MessageBox()的时候,它在背后是怎么运行的.
#ifdef UNICODE //如果定义了Unicode
#define MessageBox  MessageBoxW  //就采用宽字符的API-MessageBoxW
#else
#define MessageBox  MessageBoxA  //否则采用ASCII的MessageBoxA
#endif
但用Unicode定义的不一定能在windows 98的机器上运行.
比如MessageBoxA(NULL,TEXT("您好"),TEXT("是"),0)这样写就会报错.

编写一个程序可以自动统计UNICODE和ASCII字符个数,方法和工具不限:
#include <iostream>
#include <string>
using namespace std;
int main()
{
    char p[10];
    cin>>p;
    unsigned int uiAsciiC=0,uiUnicodeC=0;  //uiAsciiC统计ASCII字符数,uiUnicodeC统计UNICODE数
    for(int i=0;i<strlen(p);i++)
    {
        int temp=p[i];        //换成ASCII码进行比较
        if(temp>0 && 128>temp)
            uiAsciiC++;
        else
            uiUnicodeC++;
    }
    cout<<"ASCII:"<<uiAsciiC<<endl;
    cout<<"UNICODE:"<<uiUnicodeC/2<<endl;
}

                                                          id:CityPW
                                                          Shawn Chang
                                                          http://blog.csdn.net/raiden56
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:138649次
    • 积分:2164
    • 等级:
    • 排名:第17562名
    • 原创:60篇
    • 转载:15篇
    • 译文:3篇
    • 评论:100条
    最新评论