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)