zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    运算符(C# 参考)
    virtualbox修改主机名
    偏前端HTML5 sessionStorage会话存储
    偏前端纯css,手写轮播(焦点切换 和 自动轮播 只可选择一种,两者不可共存)
    偏前端 div+mui+vue.js 制作问卷调查单页 ——题目答案由后台随机给出10道
    偏前端 jqueryiframe内触发父窗口自定义事件
    TWAIN扫描打印图像编辑处理控件ImagXpress功能大全
    实时温度计湿度计高效仪器控件Iocomp使用教程
    Essential Diagram for Windows Forms绘图控件图解及下载地址
    Code39 Fontware条形码控件
  • 原文地址:https://www.cnblogs.com/ccjt/p/4320244.html
Copyright © 2011-2022 走看看