Windows核心编程04-字符编码

ASC

  7位代表一个字符,全0到全1 一共128个字符,给英文使用够用

     A地址~65

     a地址~97

     0地址~48

ASCII

  8位代表一个字符,共256个字符

    CODEPAGE--代码页,根据代码页不同后128个变成不同国家的字符

DBCS和UNICODE编码的区别

  DBCS字符编码:

      有一缺陷,单双字节混合编码 e.g.

      A   我  是  程  序  员

      01 0203 0405  0607  0809 0A0B

    但是解析时,可能为:

    01 02030405060708090A0B

    0102 030405060708090A0B

  UNICODE

    不管中文的汉字还是英文的字符都使用两个字节 高位补零

    A  我  是  程  序  员

    0001 0203 0406 0607 0809 0A0B

    解决了DBCS编码先天的不足

字符集的应用

    char每个字符占1个字节或2个字节(DBCS编码方式)

  宽自己字符

    wchar_t每个字符占2个字节(UNICODE)

    wchar_t实际是unsigned short类型,定义时,需要增加"L" 通知编译器按照双字节编译字符串,采用UNICODE编码

    需要使用支持wchar_t函数操作宽字节字符串。例如:

      wchar_t* pwszTest = L"Hello wchar";

      wprint(L"%s\n",pwszTest);

    L是给编译器cl.exe看的,编译器看到""前有L就知道每个字符占双字节

  

// WinCharacter.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
#define WIDECHAR

void C_char()
{
    char *pszText = "hello char";
    printf("%s\n",pszText);
}
void W_char()
{
    wchar_t *pwszText= L"hello wchar";
    int nLen = wcslen(pwszText);
    wprintf(L"%s,%d\n",pwszText,nLen);//L只对%s起作用
}
void T_char()
{
#ifdef WIDECHAR //#ifndef 本文件内向上朔源性 
    wchar_t *pszText = L"hello";
    wprintf(L"%s\n",pszText);
#else
    char *pszText="hello";
    printf("单:%s\n",pszText);
#endif
}
int main(int argc, char* argv[])
{
    //C_char();
    //W_char();
    T_char();
    return 0;
}

 wprintf对Unicode的支持不好,可以用Writeconsole代替

BOOL WriteConsole(
  HANDLE hConsoleOutput, //标准输出句柄 标准输入句柄 标准错误句柄 除了这三类之外其他句柄暂时理解为用来找内存的
  const VOID* lpBuffer,     //输出内容buffer
  DWORD nNumberOfCharsToWrite,    //准备输出内容的长度
  LPDWORD lpNumberOfCharsWritten,    //实际输出内容的长度
  LPVOID lpReserved        //备用
);

GetStdHandle

HANDLE GetStdHandle(
  DWORD nStdHandle
//STD_INPUT_HANDLE,STD_OUTPUT_HANDLE,STD_ERROR_HANDLE
);//函数的返回获取具体的标准句柄

 

// WinCharacter.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
#define WIDECHAR
#define UNICODE

void C_char()
{
    char *pszText = "hello char";
    printf("%s\n",pszText);
}
void W_char()
{
    wchar_t *pwszText= L"hello wchar";
    int nLen = wcslen(pwszText);
    wprintf(L"%s,%d\n",pwszText,nLen);//L只对%s起作用
}
void T_char()
{
    TCHAR *pszTest = __TEXT("hello");
#ifdef UNICODE
    wprintf(L"%s\n",pszTest);
#else
    printf("单:%s\n",pszTest);
#endif
/*#ifdef WIDECHAR //#ifndef 本文件内向上朔源性 
    wchar_t *pszText = L"hello";
    wprintf(L"%s\n",pszText);
#else
    char *pszText="hello";
    printf("单:%s\n",pszText);
#endif*/

}
void PrintfUnicode()
{
    HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
    for(WORD nHigh = 50; nHigh<256;nHigh++)
    {
        for(WORD nLow=50; nLow<256;nLow++)
        {
            wchar_t wcChar = nHigh*256 + nLow;
            //wprintf(L"%s",&wcChar);
            WriteConsole(hOutput,&wcChar,1,NULL,NULL);
            
        }
        printf("\n");
    }
}
int main(int argc, char* argv[])
{
    //C_char();
    //W_char();
    //T_char();
    PrintfUnicode();
    return 0;
}

 

    

posted @ 2016-06-08 19:31  Visions  阅读(290)  评论(0编辑  收藏  举报