Windows核心编程04-字符编码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

 

    

以上是关于Windows核心编程04-字符编码的主要内容,如果未能解决你的问题,请参考以下文章

Windows核心编程之核心总结(第二章 字符和字符串处理)(2018.5.27)

Windows核心编程第二章,字符串的表示以及宽窄字符的转换

标准AscⅡ字符

字符编码GBKGB2312和UTF-8的区别与联系

为啥C语言编程时输入数字转化为了ASC码

廖雪峰Java2面向对象编程-6Java核心类-1字符串和编码