美文网首页
[理解] C/C++ 字符编码

[理解] C/C++ 字符编码

作者: CrazyTiger | 来源:发表于2018-03-27 20:51 被阅读0次

    直接说说我的理解。

    char与wchar_t

    1. 这两个类型是C++定义的类型。
      用char定义的字符串,对应的字符集是扩展的ANSI,在简体中文的操作系统上,就是gb2312字符集。
      用wchar_t定义的字符串,对应的字符集是Unicode,UTF16编码方式,这是一个定长的编码方式。
      C/C++定义的就这两种,没有再多了。假设要增加一种,比如UTF8的编码方式的,那么就要顶一个新类型,比如kchar_t?
    const char* pStr1 = "你好世界A";
    // const wchar_t* pStr2 = "你好世界A"; // 编译失败
    const wchar_t* pStr2 = L"你好世界A";  
    
    printf("%d\n", strlen(pStr1)); // 打印9。9个字节,考虑到"\0",pStr1实际上是10个字节。
    printf("%d\n", wcslen(pStr2)); // 打印5。10个字节,考虑到"\0",pStr2实际上是12个字节。
    
    1. char与wchar_t的相互转化
      可以使用利用Windows API中的函数 WideCharToMultiByte 和 MultiByteToWideChar。
      代码网上很多,暂时不贴了。

    VS2005的CharacterSet设置

    1. 有两个可以设置:Multi-Byte Character Set和Unicode Character Set。
    2. 这个设置,只是通过预编译宏,修改一些宏定义,参数类型。比如MessageBox使用MessageBoxA版本还是MessageBoxW版本。对char还有wchar_t没有什么影响。
    WINUSERAPI
    int
    WINAPI
    MessageBoxA(
        __in_opt HWND hWnd,
        __in_opt LPCSTR lpText,
        __in_opt LPCSTR lpCaption,
        __in UINT uType);
    WINUSERAPI
    int
    WINAPI
    MessageBoxW(
        __in_opt HWND hWnd,
        __in_opt LPCWSTR lpText,
        __in_opt LPCWSTR lpCaption,
        __in UINT uType);
    #ifdef UNICODE
    #define MessageBox  MessageBoxW
    #else
    #define MessageBox  MessageBoxA
    #endif // !UNICODE
    

    UTF8

    基于Unicode字符集的一种变长编码方式,为了节省数据而创造出来的。常用语网络数据传输。

    项目中的应用

    1. Data编辑器
      数据结构使用wchar_t,持久化到文件的时候,直接持久化wchar_t,二进制的方式读写文件。
    2. 网络传输
      数据结构,可以使用wchar_t,也可以使用char_t。绝大部分都是wchar_t,只用登录用的是char_t。收发协议,只要一直就可以了。网络发包最外层有没有压缩数据,就不知道了。先不管了。
    3. Lua配表文件
      Lua文件是UTF8的。读写Lua的时候。部分怎么读写的,还要再看看???
    4. 国际化工具
      还没看???

    参考

    带你玩转Visual Studio——带你理解多字节编码与Unicode码
    C++ WINDOWS下 wchar_t *和char * 相互转化总结篇
    彻底搞定char/wchar_t!
    最后这篇文章要好好看看。

    1. CString
      CString对应的字符串应该是TCHAR,TCHAR的定义是这样的,
    #ifdef _UNICODE
    typedef wchar_t TCHAR;
    #else
    typedef char TCHAR;
    #endif
    
    1. 通用性字符串
      通用字符型TCHAR
      ifdef UNICODE it is wchar_t(WCHAR)for Unicode platforms;
      else it is char for ANSI and DBCS platforms.
      通用字符串指针LPTSTR
      ifdef UNICODE it is LPWSTR(wchar_t) for Unicode platforms;
      else it is LPSTR (
      char) for ANSI and DBCS platforms.
      通用通用常数字符串指针LPCTSTR
      ifdef UNICODE it is LPCWSTR(const wchar_t) for Unicode platforms;
      else it is LPCSTR (
      const char) for ANSI and DBCS platforms.

    相关文章

      网友评论

          本文标题:[理解] C/C++ 字符编码

          本文链接:https://www.haomeiwen.com/subject/gbascftx.html