我在自己的机器上做了一个小测试,开发环境VS2005,得到了一些让我比较疑惑的结果。
代码如下:
#include "stdafx.h"
#include "iostream"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
char *str = "ASCII string 我是中国人 ASCII string";
wchar_t *wStr = L"Unicode string 我是中国人 Unicode string";
TCHAR *tStr = _T("TCHAR string 我是中国人 TCHAR string");
cout<<*str<<endl;
cout<<str<<endl;
wcout<<*wStr<<endl;
wcout<<wStr<<endl;
#ifndef _UNICODE
cout<<*tStr<<endl;
cout<<tStr<<endl;
#else
wcout<<*tStr<<endl;
wcout<<tStr<<endl;
#endif
return 0;
}
该代码分别在Multi-Byte Character Set, Unicode, No set 三个环境下进行编译得到一下结果:
---------NO set--------------
A
ASCII string 我是中国人 ASCII string
U
Unicode string T //1.中文以及后面的字符都没有显示出来?
TCHAR string 我是中国人 TCHAR string
------Use Multi-Byte Character Set-----
A
ASCII string 我是中国人 ASCII string
U
Unicode string T //2. 这里T之前居然没有换行?
TCHAR string 我是中国人 TCHAR string
-------Use Unicode Character Set--------
A
ASCII string 我是中国人ASCII string
U
Unicode string //3.TCHAR的字符没有显示出来?
问题:4.汉字在No set和 Multi-Byte Character Set 下, 内存中是什么样的编码方式?我知道汉字有GB2312, GBK等编码方式。
紧接着我把控制面板里的区域与语言中的高级里面的“Language for non-Unicode programs”从chinese改成了English(us),重启机器用vs2005再打开代码的时候
发现“我是中国人”字符串已经变成了乱码"ÎÒÊÇÖйúÈË"
5. 我想这是不是应为我之前在vs2005输入中文的时候,保存的cpp是不是以ANSI方式保存的造成的?(记事本里面有好几种保存编码方式)
在没有做任何修改的情况下我有在三种不同编译方式下运行代码,得出的结果是:
--------------NO set--------------
A
ASCII string ╬╥╩╟╓╨╣·╚╦ ASCII string
U
Unicode string ╬╥╩╟╓╨╣·╚╦ Unicode string
T
TCHAR string ╬╥╩╟╓╨╣·╚╦ TCHAR string
----------------Use Multi-Byte Character Set--------
A
ASCII string ╬╥╩╟╓╨╣·╚╦ ASCII string
U
Unicode string ╬╥╩╟╓╨╣·╚╦ Unicode string
T
TCHAR string ╬╥╩╟╓╨╣·╚╦ TCHAR string
----------Use Unicode Character Set----------------
A
ASCII string ╬╥╩╟╓╨╣·╚╦ ASCII string
U
Unicode string ╬╥╩╟╓╨╣·╚╦ Unicode string
T
TCHAR string ╬╥╩╟╓╨╣·╚╦ TCHAR string
问题:
6. 怎么三种情况下的结果都是一样? 还有为什么这些字符串没有像前一次运行时被自动截断?
7. 以后我们再处理中文时候应该注意些什么,比如对文件的命名,保存中文文档时等等
问题比较多,请高手指点指点,谢谢!