• 回炉重造之重读Windows核心编程-002-字符集


      使用Unicode的优势:

    • 便于在不同语言之间进行数据交换。
    • 让你的exe或者dll文件支持所有的语言。
    • 提高应用程序的执行效率

      Windows2000是使用Unicode重新开发的,核心部分都需要Unicode字符串。所以:

    • 参数中传入一个ANSI字符串,那么系统就要先把这个ANSI字符串转换成Unicode,然后将Unicode字符串传给系统;
    • 返回值是一个ANSI字符串,那么系统首先要把Unicode转成ANSI,才能返回给应用程序。

      这些操作必须要分配内存,调用函数,都是在你看不到的情况下发生的。因此直接使用Unicode,可以让你的应用程序更加高效率地运行。

      C语言对Unicode的支持是wchar_t。在VS中则是定义UINICODE和_UNICODE。

      ANSI改成Unicode字符串有三种方式,字符串前加一个L、使用TEXT宏和_T宏。

      如果是使用的DLL和调用它的EXE,分别使用Ansi版本和Unicode版本,只需要分配内存,然后转换就可以调用了。

      对于功能相同的两个函数,尽量使用Unicode的版本。

      ShlWApi.h头文件中,也提供了操作字符串的Ansi和Unicode版本。

      转换你的应用程序到Unicode版本的一些基本原则:

    • 将文本视为字符串,而不是char或者字节数组
    • 对于文本字符串和字符串,使用通用数据类型(TCHAR或者PTSTR)
    • 对于字节、字节指针和数据缓存,使用显式数据类型(BYTE,PBYTE)
    • 将TEXT宏用在字符和字符串上。
    • 执行全局性替换(例如使用PTSTR替换PSTR)
    • 字符串运算问题。使用Unicode版本字符串后,在分配内存的时候必须写sizeof(szBuffer)/sizeof(TCHAR)。这样的失误,编译器不会发出任何警告。

      Windows对字符串进行操作的函数:lstrcat、lstrcmp、lstrcmpi、lstrcpy、lstrlen。这些函数是作为宏实现的。真正比较两个Unicode字符串的函数是CompareString(LCID lcid, DWORD fdwStyle, PCWSTR pString1, int cch1, PCTSTR pString2, int cch2);

    • 第一个参数是函数GetThreadLocale()的返回值,它返回当前语言的设置;
    • 第二个参数用于标识一些标志,用于比较字符串时的方式。使用lstrcmplstrcmpi的话,默认值是不一样的。

      其他的C运行时函数为了支持Unicode的版本,例如CharLowerCharUpperCharLowerBuffCharUpperBuffIsCharAlphaisAlphaNumber

      最后一个是printf函数家族,有char版本的sprintfswprintf

      资源内的字符串们,会使用Unicode,不是也被系统内部转换。

      确定字符串是Ansi还是Unicode,可以使用函数IsTextUnicode区分,尽管它有可能返回不正确的结果

      在Unicode和Ansi之间转换字符串,使用两个函数MultiByteToWideCharWideCharToMultiByte

      

      

  • 相关阅读:
    MSSQL中join的用法詳解
    程序员的十层楼
    【搜集】错误为: [Microsoft][SQL Native Client]客户端不支持加密
    關於 ASP.NET 中System.OutOfMemoryException 的問題與解決方法
    CSS:快速提升设计可读性和维护性
    【调查 】DBA的压力究竟有多大?
    从沙子到芯片:且看处理器是怎样炼成的
    與伺服器的連接已成功建立 但在登入程序時發生錯誤。 provider 共用記憶提供者 error 0 管道的另一端上無任何處理程序。
    【ZT】Visual Studio Team System縱覽
    Win32.Induc.A的清理方法
  • 原文地址:https://www.cnblogs.com/leoTsou/p/12344230.html
Copyright © 2020-2023  润新知