Convert CString to ANSI string in UNICODE projects

Quick Answer: use an intermediate CStringA.

  • Normally, this is not something that should be done. *It is technically unreliable, unless you can guarantee that the source CString to be converted does not contain any 2-byte characters.
  • This will work fine if you are using the English language without any special 2-byte symbols or accented letters.
  • This article is for educational use, and explains how it can easily be done, without relying on the USES_CONVERSION macro with W2A, or ridiculous WideCharToMultiByte API functions.
  • If you are using a language that actually requires Unicode (Asian languages, etc), or if the source CString contains any 2-byte character, this cannot be done. This is because there is no ANSI equivalent of any 2-byte character.
  • It is the responsibility of the programmer to ensure that the source CString does not contain any 2-byte characters.

    Use intermediate CStringA (highly recommended):

  • Pros: this is the easiest to use.
  • Cons: you cannot specify a code page.

    CString LastNameW(L"Smith");

    CStringA LastNameA(LastNameW);

    FunctionForAnsi(LastNameA.GetString());

  • Or an even simpler example:

    CString LastNameW(L"Smith");

    FunctionForAnsi(CStringA(LastNameW).GetString());

    Here are some other ways that either do not work or are not recommended. I list them here to document things to avoid. What not to do.

    WideCharToMultiByte API function (not recommended):

  • Pros: you can specify the desired code page.
  • Cons: too much code to write, test, debug.

    CString LastNameW(L"Smith");

    int nLen =
    WideCharToMultiByte(CP_ACP,
    0,
    (LPCWSTR)LastNameW,
    -1, NULL, NULL);

    LPSTR lpszA =
    new CHAR[nLen];

    WideCharToMultiByte(CP_ACP,
    0,
    (LPCWSTR)LastNameW,
    -1, lpszA, nLen);

    FunctionForAnsi(lpszA);

    delete[] lpszA;
    // free the string

    W2A ATL 3.0 macros (not recommended):

  • Cons: not safe inside loops.
  • Cons: you cannot specify a code page.

    USES_CONVERSION;

    CString LastNameW(L"Smith");

    FunctionForAnsi(W2A(LastNameW.GetString()));

    CW2A ATL 7.0 conversion template classes (not recommended):

  • There are 3 ways you can use the CW2A template class. Only one of them is the right way.
  • Cons: too difficult to remember the correct usage
  • Cons: too easy to use improperly.

    CString LastNameW(L"Smith");

    CW2A pszA(LastNameW.GetString());
    // this is the right way

    FunctionForAnsi(pszA);

    CString LastNameW(L"Smith");

    FunctionForAnsi(CW2A(LastNameW.GetString()));
    // improper usage, do not do this

    CString LastNameW(L"Smith");

    LPCSTR pszA =
    CW2A(LastNameW.GetString());
    // improper usage, do not do this

    FunctionForAnsi(pszA);

    (LPCSTR)(LPCTSTR) cast:

  • Do not use this!
  • You cannot use (LPCSTR)(LPCTSTR) to cast a CString to LPCSTR in Unicode projects.
  • It does compile, but it does not properly convert the CString to an LPCSTR.
  • The resulting string will either be 0 or 1 length, or filled with garbage characters of unknown length, because the cast just changes the pointer type without any conversion.
  • You end up with a CHAR* pointing to a WCHAR array, a very bad thing.

    CString LastName(L"Smith");

    FunctionForAnsi((LPCSTR)(LPCTSTR)LastName);
    // improper usage, do not to this

    REF:

    ATL String: What's wrong with the USES_CONVERSION macros? How to avoid using them?

    Using MFC MBCS/Unicode Conversion Macros

    ATL and MFC String Conversion Macros

    CString Management

Convert CString to ANSI string in UNICODE projects的更多相关文章

  1. convert \uXXXX String to Unicode Characters in Python3.x

    转换\uXXXX if Python3.x: str.decode no longer exists in 3.x. that']s why Python 3.4: str : AttributeEr ...

  2. CString和string在unicode与非unicode下的相互转换(转)

    原文转自 http://blog.csdn.net/u014303844/article/details/51397556 CString和string在unicode与非unicode下的相互转换 ...

  3. Convert CString to TCHAR

    Quote from: http://vctipsplusplus.wordpress.com/2008/05/21/cstring-to-tchar/ CString is a very usefu ...

  4. CString 与 std::string 相互转化

    MFC中CString 与 std::string 相互转化 CString实际是CStringT, 也就是模板类, 在UNICODE环境下,实际是CStringW, 在多字符集环境下,实际是CStr ...

  5. 【原创】利用typeface实现不同字体的调用显示及String转换为Unicode

    最近工作用到,就写个小demo demo实现从assets中利用typeface调用不同字体,并在editText中显示出来 1.layout中创建activity_main.xml文件 布局代码如下 ...

  6. How to convert any valid date string to a DateTime.

    DateTimeFormatInfo pattern = new DateTimeFormatInfo() { ShortDatePattern = "your date pattern&q ...

  7. mfc中CString转化为string的方法

    LL(1)分析法实验的mfc做到最后因为CString转化为string的问题卡了一个多小时,也是惨,网上各种方法找过都不行.幸亏最后还是找到几行代码搞定了.特此mark一下. USES_CONVER ...

  8. 异常-----Can't convert the date to string, because it is not known which parts of the date variable are in use. Use ?date, ?time or ?datetime built-in, or ?string.\u003Cformat> or ?string(format) built-

    1.错误描述 五月 27, 2014 12:07:05 上午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template proc ...

  9. pywinauto: 导入时遇到 "TypeError: LoadLibrary() argument 1 must be string, not unicode"

    pywinauto: 导入时遇到 "TypeError: LoadLibrary() argument 1 must be string, not unicode" 经查询, 看到 ...

随机推荐

  1. 【CF148D】 Bag of mice (概率DP)

    D. Bag of mice time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  2. 汉化 的 空指针 bug

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha nulljava.lang.NullPointerException at com.an ...

  3. parcelable 和 serializable 区别

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha serializable 是 java 中的 序列化 接口. parcelable 是 ...

  4. CF961E Tufurama 主席树

    对原问题进行转化 考虑对每个$i$,询问在$j \in [i + 1, a[i]]$中满足$a[j] \geqslant i$的个数 这样子可以做到不重不漏 个数满足差分的性质,使用主席树来维护即可 ...

  5. 浅析SDWebImage

    浅析SDWebImage 在日常的开发过程中,如果去优雅的访问网络的图片并去管理每个工程必须要面对的问题,如果想要在工程里面提供易用.简洁.方便管理的解决方案还是很有挑战的,毕竟还要兼顾图片文件的缓存 ...

  6. nginx_lua vs nginx+php 应用场景

    在我的印象中很多人还是选择nginx+php这种组合搭配,你的选择是nginx+lua,那么nginx+lua比和php的组合优势在哪里?清无:首先,Nginx+php之间是要有进程之间通信的,这样以 ...

  7. 2018-2019-2 20162318《网络对抗技术》Exp2 后门原理与实践

    一.实验内容 1.使用netcat获取主机操作Shell,cron启动 2.使用socat获取主机操作Shell, 任务计划启动 3.使用MSF meterpreter(或其他软件)生成可执行文件,利 ...

  8. hdoj 5122 K.Bro Sorting 贪心

    K.Bro Sorting Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Others) Tot ...

  9. Yii together

    一对多,多对多的关联时最后的参数 together说明 如果为false,分开查多个语句 如果为true,强制生成一个语句 如果没有设置,分页页生成多个语句,不分页时生成一个语句 多对多时,查询时,中 ...

  10. String对象池的作用

    我们知道得到String对象有两种办法:String str1="hello";String str2=new String("hello");     这两种 ...