Cstring转char*时只能获取第一个字符

  • Post author:
  • Post category:其他




你应该是用了UNICODE编码,每个字符都是双字节的,对于英文字符串来说,其UNICODE编码的第2个字节是0,所以你只能获取到第一个字母(因为接着就是0结尾了)。

所以char类型与wchar_t是不能直接强制转换的。具体还跟你程序选择的字符集有关系。解决办法有2种:

1.将你的工程改为本地多字符集就行。如果你是VC,一般在你工程项目属性的常规页面里面就有。

2.是在转换为char之前进行字符集转换。Windows下使用WideCharToMultiByte函数API就行。

如果不想跟底层API打交道,这里告诉你一个在VC中有效的UNICODE与本地多字节转换的诀窍:

那就是使用CStringW与CStringA。在VC的实现下,CString只是对前面两种类的重定义。更为重要的是前面两个类都有一个构造函数接收另外一个类型CString,其内部自动进行了字符集转换。

因此很简单了,转换代码如下:


CString aStr(“Hello”);

char* szBuf;

szBuf = new char[aStr.GetLength()];

strcpy(szBuf, aStr.GetString());

现在szBuf就可以使用了

一般来说,我们程序内部都会普遍使用UNICODE编码,当我们与一些老系统库接口时不得不面临转换为本地多字节编码的问题(对我们来说一般就是GBK)。CStringA的办法我一直用在我的MFC程序里,简单好用。

以上,仅限于UNICODE与本地多字节编码之间的转换,至于UTF-8之类的就不适用了(当然UTF-8的ASCII码部分是标准的ASCII编码,不会存在LZ的问题,只是中文乱码罢了)

其实,字符编码与字符类型其实还是有很多繁琐的细节的,而且单纯的说某字符串是UNICODE编码也是不严谨的,具体还是去问度娘或GOOGLE,我也是在多年前做我们自己的XML解析器的时候被折磨够呛,才仔细去了解这方面的内容。