首页
社区
课程
招聘
[原创]Windows核心编程 第2章读书笔记
发表于: 2012-4-16 20:21 5608

[原创]Windows核心编程 第2章读书笔记

2012-4-16 20:21
5608

接着上一篇写,都是手打的,所以估计有错别字啊
第一篇地址:
http://bbs.pediy.com/showthread.php?p=1064353&posted=1#post1064353

二.字符和字符串处理
     1.UTF全称Unicode Transformation Format,UTF-16每个字符编码为2字节16位;

     2.在Windows程序中使用UTF-16能改进性能和减少内存消耗;
     自Windows NT起,Windows的所有版本都完全用Unicode来构建,调用Windows函数 时,如果传入一个ANSI字符,那么函数首先把字符串转换为Unicode,再把结果传给操作系统,
如果希望函数返回ANSI字符串,那么操作系统会先把Unicode转换为ANSI字符串,再把结果返回给应用程序;

     3.Microsoft的C/C++编译器定义了一个内建的数据类型wchar_t,表示16位的Unicode字符
      wchar_t  c=L'A';

      4.在Windows头文件WinNT.h中定义:
    typedef char CHAR;   //8-bit
      typedef CHAR *PCHAR;
      typedef CONST CHAR *PCSTR;
-------------------------------------------------------------------------------------------------------
      typedef wchar_t WCHAR;    //16-bit
       typedef WCHAR *PWCHAR;
       typedef CONST WCHAR *PCWSTR;
   ------------------------------------------------------------------------------------------------------
   在API中经常遇到的参数类型:PCTSTR
      #ifdef UNICODE
      typedef LPCWSTR PCTSTR;
     #else
      typedef LPCSTR PCTSTR;
     #endif
     自己整理一下,果然清晰多了

     5.Windows函数的参数中有字符串,则该函数通常有两个版本,比如            CreateWindowsEx:
     在WinUser.h中,CreateWindowsEx实际上是一个宏
      #ifdef UNICODE
      typedef CreateWindowsEx CreateWindowsExW;
     #else
      typedef CreateWindowsEx CreateWindowsExA;
     #endif
     6.Microsoft开始倾向于某些函数只提供Unicode版本;

    7.C运行库中大多数字符串处理函数不检测长度参数,所以会发生缓冲区溢出;

    8.Windows中常见字符串函数
     int CompareString(
       LCID Locale,
        DWORD dwCmpFlags,
        LPCTSTR lpString1,
        int cchCount1,
        LPCTSTR lpString2,
        int cchCount2
        );
     LCID:locale ID,32位值,用来标识一种语言,这个函数以符号当地语言习惯的方式来比较,得到更有意义的结果
--------------------------------------------------------------
     int CompareStringOrdinal(
         LPCWSTR lpString1,
         int cchCount1,
        LPCWSTR lpString2,
        int cchCount2,
         BOOL bIgnoreCase
       );
     这个函数执行的是码位(code-point)比较,不考虑区域设置,所以速度很快,只支持Unicode字符串;

     9.TCHAR
     当没有定义_UNICODE宏时,TCHAR = char
     当定义了_UNICODE宏时,TCHAR = wchar_t

     10.TEXT是在winnt.h中定义
     举例:TCHAR *ptch = TEXT("This is a const string.");   
     如果使用UNICODE字符集, 则TEXT("This is a const string.")相当于L"This is a      const string.",
      如果使用ASCII集, 则上述字符串相当于“This is a const string.”;

     11.Unicode与ANSI字符串转换
      int WideCharToMultiByte(
        UINT CodePage,
           DWORD dwFlags,
          LPCWSTR lpWideCharStr,
           int cchWideChar,
        LPSTR lpMultiByteStr,
          int cbMultiByte,
          LPCSTR lpDefaultChar,
        LPBOOL lpUsedDefaultChar
        );
-------------------------------------------------------------------------------------------------------
     int MultiByteToWideChar(
        UINT CodePage,
          DWORD dwFlags,
          LPCSTR lpMultiByteStr,
          int cbMultiByte,
       LPWSTR lpWideCharStr,
       int cchWideChar
       );

     12.判断文本是ANSI还是Unicode
     BOOL IsTextUnicode(
      const VOID *lpv,
        int iSize,
       LPINT lpiResult
      );
       此方法并不一定准确。

      写完了,轻松一下,明天把第三章看完,再写一篇,希望能坚持下去。。。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 6
支持
分享
最新回复 (5)
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
2
既然看到 MultiByteToWideChar  WideCharToMultiByte

写个判断是unicode 还是utf8 还是 gbk 编码汉字的判断函数,当作练习下,写好了别忘吧代码发上来,呵呵。
2012-4-16 20:58
0
雪    币: 55
活跃值: (75)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
既然读完了,那么楼主,有这么几个问题
第一、不同国家的使用的语言不同,如何才能将文字正确显示? unicode 也只有0xffff个,而汉字就有两万多个,如果全球总的字符数超出了,咋办的?
第二、strcpy会很多的缓冲区溢出的罪魁祸首,Windows是怎么解决这一问题的呢?他的实现原理是什么?为什么就能解决缓冲区溢出呢?
第三、unicode和ascii码字符转换时,每个参数的意义弄懂了么?
第四、如何做才能让自己的程序 在不同的语言下,都能正确编码呢?
个人意见,如有冒犯,还请谅解~!
2012-4-16 21:48
0
雪    币: 27
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
个人理解 对于unicode字符 在16位中表示应该是FFFF:FFFF个 段地址+偏移  而在32中则更多ffffffff
个 64 就更不用说了  只是个人理解  若有错误 请指点 谢谢
2012-4-16 22:47
0
雪    币: 31
活跃值: (48)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
楼上还真没说对,宽字符用两个字节表示一个文字,中日韩(CJK)文字在0x3000到0x9fff,一般汉字的首字节大于ascii(0x80 ),跟随字节不好说。从内存角度来看,只是一个字型数据,和段:偏移扯不上,更和数据线宽度无关。
参考<Windows程序设计>第二章。
2012-4-16 23:33
0
雪    币: 27
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
感谢楼上的指出 我会好好看看《Windows程序设计》这本书的
2012-4-17 00:02
0
游客
登录 | 注册 方可回帖
返回
//