• MFC unicode字符集与多字节字符集 问题之彻底终结!


    Unicode 和多字节字符集 (MBCS) 支持

    Visual Studio .NET 2003
     

    有些国际市场以大字符集来使用日文和中文等语言。为了支持这些市场的编程,Microsoft 基础类库 (MFC) 支持以两种方式处理大字符集:

    unicode和多字节字符集是两种不同的编码方式,不同的编码方式下,所对应的一些函数是不兼容的。

    读到多字节菜单字符串之后,用MultiByteToWideChar()转为unicode字符串

    或者 使用API的A版本来设置菜单的显示名称,比如,SetMenuItemInfoA(...)

    如果你新的库是Unicode的,就用Unicode开发,摒弃多字节编码,多字节编码弊端太多了。
    其实改起来很简单,你把所有的char都改成TCHAR,如果能用CString,尽量用CString。所有字符串函数都换上带_t的版本,比如_tsprintf()、_tcscpy之类的……因为这些东西都是同时兼容Unicode和ANSI的,所以改起来很容易。

    你只要对于那些少数的多字节dll函数,参数传送字符串时实现用WideCharToMultiByte转换一下。

    我们在最开始学习MFC的时候,毫无疑问会遇到这样的问题。

    VC6的设置:多字节。
    vs的默认设置:Unicode,在属性中可以改成多字节。
    多字节编码:char,string,CStringA。
    Unicode编码:wchar_t,wstring,CStringW。
    注意:如果项目是Unicode,那么CString就被定义为CStringW,否则就是CStringA。
    附:
    LPSTR = char*;LPCSTR = const char*;
    LPWSTR = wchar_t*;LPCWSTR = const wchar_t*;
    至于LPCTSTR也是根据项目字符集来定义为LPCWSTR(Unicode)或LPCSTR(多字节)。
    OK,上面的定义很明显了,注意用的时候别弄混了,我觉得最好的方式是,使用wchar_t和wstring(api大多使用unicode,即使是多字节版本也是把多字节转成unicode再去调用unicode版api),我不太喜欢CString。
    接下来就是转换:www.2cto.com
    // C++
    char* 到 string:string str("char"); 或者string str = "char";
    string 到 char*:const char* ch = str.c_str();
    wchar_t* 和 wstring与上相同。
    // MFC
    char* 到 CStringA:CStringA str("char");
    CStringA 到 char*:const char* ch = str.operator LPCSTR(); (注意:反对使用GetBuffer,因为使用这个,必须要ReleaseBuffer,而且很多时候没必要去分配空间)
    wchar_t* 和 CStringW与上相同。
    // 字符集之间转换
    char* 到 wchar_t*:CA2W a2w("char");  const wchar_t* wch = a2w.operator LPCWSTR();
    wchar_t* 到 char*:CW2A w2a(L"wchar_t"); const char* ch = w2a.operator LPCSTR();  (注意:反对使用_T("chs")这种方式,程序字符集在一开始就该确定,而且最好选择Unicode)
    关于CA2W和CW2A这两个类,可以在atlconv.h中找到源代码,其实就是对WideCharToMultiByte和MultiByteToWideChar的封装。
     
     
    http://bbs.esrichina-bj.cn/ESRI/thread-97480-1-1.html

    ------解决方案--------------------

    读到多字节菜单字符串之后,用MultiByteToWideChar()转为unicode字符串

    或者 使用API的A版本来设置菜单的显示名称,比如,SetMenuItemInfoA(...)

    ------解决方案--------------------
    如果你新的库是Unicode的,就用Unicode开发,摒弃多字节编码,多字节编码弊端太多了。
    其实改起来很简单,你把所有的char都改成TCHAR,如果能用CString,尽量用CString。所有字符串函数都换上带_t的版本,比如_tsprintf()、_tcscpy之类的……因为这些东西都是同时兼容Unicode和ANSI的,所以改起来很容易。
     
    char *str=(LPSTR)(LPCTSTR)strText; //CString转为Char* 
     char * ch_a =(char*)str.GetBuffer(str.GetLength());

    参考文献:

    https://msdn.microsoft.com/zh-cn/library/cc468203(v=VS.71).aspx

    https://msdn.microsoft.com/zh-cn/library/cz0a83sb

    ccjt.taobao.com

  • 相关阅读:
    《Asp.Net Forums2.0深入分析》之 Asp.Net Forums是如何实现代码分离和换皮肤的
    Community Server专题五:IHttpHandlerFactory
    自定义 HttpModule 示例
    动态加入控件的方法
    JS应用DOM入门:DOM的对象属性
    JS应用DOM入门:简单文档DOM结构分析
    httpmodule专题(2)
    Java 算法之快速排序
    HTML与.jsp的融合
    Exception
  • 原文地址:https://www.cnblogs.com/ccjt/p/4320244.html
Copyright © 2020-2023  润新知