zoukankan      html  css  js  c++  java
  • 另一篇VC下的UNICODE编程

        在VC6中,默认使用MBCS编码,即多字节字符;而VC8、VC7默认的是Unicode编码,实际就是支持大于0x80的ASCII码。这样,一个中文字可以表示为2个字节,GB2312就是这样表示的。


        VC6的默认安装是不带UNICODE库的,要在VC6中写UNICODE程序,必须安装CRT和MFC的Unicode库。要使你的程序支持Unicode,要在你的项目属性中去掉"_MBCS"宏定义,增加"UNICODE"和"_UNICODE"两个宏定义。(注意,这两个都应该加上,因为CRT和MFC使用UNICODE定义,而STL则使用_UNICODE)。

        如果你的程序是MFC的,则Unicode版MFC库的入口点是wWinMainCRTStartup。

        VS2005工程的默认字符集是Unicode。

        

       为了方便开发者,VC6中提供了Tchar.h,里面定义了一些宏用来帮助写两种编码都兼容的代码。

    CRT中的相关函数在Tchar.h中都定义了相应的替代,基本是将str换成了_tcs,

    比如:CRT中的unsigned int strlen(const char *)现在是unsigned int _tcslen(const TCHAR*),

    在Uniocde时,将被替换为unsigned int _wcslen(const wchar_t)*,

    而在MBCS时,会被替换为unsigned int _mcslen(const char*)。


    看,写Unicode和MBCS兼容的代码挺容易的吧,我总结了一些替换规则

    1 将char换成TCHAR (unsigned char必须去掉unsigned)

    2 将str函数换成_tcs函数

    3 将字符串常量定义加要_T("")宏

    4 printf函数族必须修改为wprintf,不过要注意千万不要使用wprintf函数来解析char型

    很多时候程序中既需要Unicode,又需要使用ASCII,这时需要用到操作系统的2个API

    WideCharToMultiByte用来将Unicode字符串转化为MBCS的

    MultiByteToWideChar用来将MBCS字符串转化为Unicode的

    一些注意事项:

    在Unicode编码下,sizeof没那么可靠了,memset( 0 sizeof())的习惯用法可能会出大错,改成memset(0sizeof()/szieof(TCHAR))就没事了,呵呵

    在Unicode下,一个中文字符就是一个字符,len = strlen() / 2;这样可不行了

    用VC6进行UNICODE编程

    最近试图将自己的程序编译成Unicode版本,费了不少力气,相关内容整理如下,适用于VC6,但VC7、VC8应该也差不多的(后者新建项目缺省即按Unicode编译)。

    1. 添加 UNICODE 和 _UNICODE 预处理定义

    位置:Project Settings -> C/C++ -> Preprocessor definitions

    添加了这两个定义后,MFC的一些内置类型如 TCHAR、CString 都将转为支持宽字符类型(wchar_t)

    2. 使用宽字符相关类型,如:

    char -> TCHAR、char * -> LPTSTR、const char * -> LPCTSTR

    3. 对字符串常量使用 _T() 宏

    4. 替换C库中的中字符串操作函数,如 strlen -> _tcslen、strcmp -> _tcscmp 等

    类似的还有C库中字符串与数字的转换函数,如 atoi -> _ttoi、itoa -> _itot 等

    5. 将 Project Settings -> link -> Output -> Entry Point 设为 wWinMainCRTSTartup

    否则会有如下错误:
    msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16

    6. C++标准库中的string,有对应的宽字符版本wstring,两者均为basic_string的特化版本

    可在StdAfx.h中:

    #ifdef _UNICODE
    #define tstring wstring
    #else
    #define tstring string
    #endif

    然后在代码中使用 tstring 即可,类似的还有 fstream/wfstream、ofstream/wofstream 等

    7. 宽字符版本的英文字符仍可直接与整型值进行比较,如:

    CString s = _T("ABC");
    ASSERT(s[0] == 'A');

    8. 对于仍需使用ANSI字符串的地方,如第三方类库的接口,仍可继续使用;如需进行Unicode字符串和ANSI字符串的互转换,可使用 MultiByteToWideChar 和 WideCharToMultiByte

     

     

     

     

     

     


  • 相关阅读:
    Linux 操作memcache命令行
    查看memcache版本
    磊哥测评之数据库SaaS篇:腾讯云控制台、DMC和小程序
    一看就能学会的H5视频推流方案
    JavaScript与WebAssembly进行比较
    Android调试神器stetho使用详解和改造
    5分钟入门git模式开发
    深耕品质,腾讯WeTest《2018中国移动游戏质量白皮书》正式发布
    RSA签名的PSS模式
    附实例!图解React的生命周期及执行顺序
  • 原文地址:https://www.cnblogs.com/huhu0013/p/1872433.html
Copyright © 2011-2022 走看看