关于windows编程里的各种奇形怪状的String和转换
2014-04-15 05:34
357 查看
那么多 CString、CStringA、CStringW、LPCTSTR、LPTSTR、LPSTR、LPCSTR、WCHAR、TCHAR、string、wchar_t、char、char*、char[] ,看得人头疼
简单总结一下作参考,不是绝对正确的哦
一.编码
ASCII 占一个字节(8位) 也就会窄字节
Unicode 占两个字节(16位) 也就是宽字节
ANSI编码 在中文系统里即 GB2312编码 也是占两个字节(16位) ?
我用的是VS2008 ,对项目-属性-字符集配置可以有三种
“未设置”(即ANSI编码) ,
“unicode” (Unicode编码),
“多字节”
二. char,wchar_t ,L宏
char :单字节变量类型,最多表示256个字符,
wchar_t :宽字节变量类型,用于表示Unicode字符,
它实际定义在<string.h>里:typedef unsigned short wchar_t。
为了让编译器识别Unicode字符串,必须以在前面加一个“L”,定义宽字节类型方法如下:
wchar_t c = `A’ ;
wchar_t * p = L”Hello!” ;
wchar_t a[] = L”Hello!” ;
其中,宽字节类型每个变量占用2个字节,故上述数组a的sizeof(a) = 14
(此段摘自 http://www.cnblogs.com/wanghao111/archive/2009/05/25/1488816.html )
三. CString , char*, string 之间的转化
在vs2008项目-属性-字符集设置为”多字节”的情况下
以变量CString cstring1, std::string string1, char* char1 为例
1.CString 转 String,char*
string1 = CString1; //CString 转 String
char1 = cstring1.GetBuffer(); //CString 转 char*
cstring1.ReleaseBuffer();
2.String 转 CString ,char*
cstring1 = string1.data(); //String 转 CString
new char[string1.length()+1]; //String 转 char*
strcpy( char1,string1.data() );
3.char* 转 CString, String
cstring1 = char1; // char* 转 CString,
string1 = char1; //char* 转 String
一般把项目字符集设置为unicode,省掉一些不必要的繁琐,所以
在vs2008项目属性字符集设置为unicode(宽字符集)的情况下
上面的三个转换做一些改动
1.string使用 std::wstring 类型
2.char*使用 WCHAR* 类型
3.定义字符串时使用L宏
4.spycpy() 改为使用 wcscpy()
如下:
CString cstring1 = L”test”;
std::string string1 = L”test”;
char* char1 = L”test”;
new WCHAR[string1.length()+1]; //String 转 char*
wcscpy( char1,string1.data() );
上面的代码区分了多字符,宽字节,但是编写时要做属性的切换比较麻烦,所以
使用_T宏可以让编译器自动识别宽字节还是多字节
和上面相比,作如下改动:
1.把上面的L宏 改为 _T()
2.不用WCHAR,而用TCHAR
3.依然使用std::string, 不必用std::wstring
4.依然使用spycpy(), 不必用wcscpy()
VS2008项目属性有Mutil-Byte和Unicode两种,Cstring中的字符采用TCHAT编码,而TCHAR在Unicode下是char 8位表示已个字符。在Mutil中是WCHAR即16位表示一个字节。
所有在Mutil-Byte中 char *p=(LPCTSTR)CString就正确。
四. LP系列:
LPWSTR =( lp表示long pointer指针, w表示wchar_t)
LPCWSTR =(和lpwstr相比,多了一个c,即const常量)
LPCSTR (lp表示long pointer指针, C表示const常量)
LPCWSTR (自己猜~)
简单总结一下作参考,不是绝对正确的哦
一.编码
ASCII 占一个字节(8位) 也就会窄字节
Unicode 占两个字节(16位) 也就是宽字节
ANSI编码 在中文系统里即 GB2312编码 也是占两个字节(16位) ?
我用的是VS2008 ,对项目-属性-字符集配置可以有三种
“未设置”(即ANSI编码) ,
“unicode” (Unicode编码),
“多字节”
二. char,wchar_t ,L宏
char :单字节变量类型,最多表示256个字符,
wchar_t :宽字节变量类型,用于表示Unicode字符,
它实际定义在<string.h>里:typedef unsigned short wchar_t。
为了让编译器识别Unicode字符串,必须以在前面加一个“L”,定义宽字节类型方法如下:
wchar_t c = `A’ ;
wchar_t * p = L”Hello!” ;
wchar_t a[] = L”Hello!” ;
其中,宽字节类型每个变量占用2个字节,故上述数组a的sizeof(a) = 14
(此段摘自 http://www.cnblogs.com/wanghao111/archive/2009/05/25/1488816.html )
三. CString , char*, string 之间的转化
在vs2008项目-属性-字符集设置为”多字节”的情况下
以变量CString cstring1, std::string string1, char* char1 为例
1.CString 转 String,char*
string1 = CString1; //CString 转 String
char1 = cstring1.GetBuffer(); //CString 转 char*
cstring1.ReleaseBuffer();
2.String 转 CString ,char*
cstring1 = string1.data(); //String 转 CString
new char[string1.length()+1]; //String 转 char*
strcpy( char1,string1.data() );
3.char* 转 CString, String
cstring1 = char1; // char* 转 CString,
string1 = char1; //char* 转 String
一般把项目字符集设置为unicode,省掉一些不必要的繁琐,所以
在vs2008项目属性字符集设置为unicode(宽字符集)的情况下
上面的三个转换做一些改动
1.string使用 std::wstring 类型
2.char*使用 WCHAR* 类型
3.定义字符串时使用L宏
4.spycpy() 改为使用 wcscpy()
如下:
CString cstring1 = L”test”;
std::string string1 = L”test”;
char* char1 = L”test”;
new WCHAR[string1.length()+1]; //String 转 char*
wcscpy( char1,string1.data() );
上面的代码区分了多字符,宽字节,但是编写时要做属性的切换比较麻烦,所以
使用_T宏可以让编译器自动识别宽字节还是多字节
和上面相比,作如下改动:
1.把上面的L宏 改为 _T()
2.不用WCHAR,而用TCHAR
3.依然使用std::string, 不必用std::wstring
4.依然使用spycpy(), 不必用wcscpy()
VS2008项目属性有Mutil-Byte和Unicode两种,Cstring中的字符采用TCHAT编码,而TCHAR在Unicode下是char 8位表示已个字符。在Mutil中是WCHAR即16位表示一个字节。
所有在Mutil-Byte中 char *p=(LPCTSTR)CString就正确。
四. LP系列:
LPWSTR =( lp表示long pointer指针, w表示wchar_t)
LPCWSTR =(和lpwstr相比,多了一个c,即const常量)
LPCSTR (lp表示long pointer指针, C表示const常量)
LPCWSTR (自己猜~)
相关文章推荐
- 泛编程中关于std::string类型字符串长度大于预留空间与小于预留空间之间互相转换的探索测试
- windows GDI编程中关于窗口和视口,逻辑坐标和设备坐标的转换
- JAVA中关于DATE时间日期加减、String与Date类型的转换
- 关于windows编程的一些心得 选择自 forpku 的 Blog
- javaSE基础编程——String的转换功能
- 关于pdo为何自动转换类型为string的问题
- JAVA里面关于byte数组和String之间的转换问题
- c++关于windows窗体编程简单实例
- Windows环境下Unicode编程总结和将ANSI转换到Unicode 将Unicode转换到ANSI
- Windows编程中各种操作文件的方法
- JAVA关于byte数组与String转换的问题
- C++中各种基本数据类型转换为string类型
- 关于在java中将string转换成日期的问题
- base64 byte[] 16进制 string 各种转换
- 一张破图胜过长篇大论(译文,关于windows 8的新编程体系)
- 30天C#基础巩固------面向鸭子编程,关于string和File的练习
- 使用 STL stringstream 做各种不同进制的字符串到整数的转换
- 用标准C++进行string与各种内置类型数据之间的转换
- [基础]关于Java强制转换中无法强制转换String的思考
- 关于Windows下的MIDI基础编程