字符串问题? VC里,代码文件都是ascii格式的,就是一个字符用一个字节表示,但是现在的系统都是Unicode格式的。是不是TEXT("")把ascii字符串转换成Unicode字符串的呢?要是"abc"这样的字符串好办,只要在高字节补0就可以,但是中文字符呢?怎么处理的?比如TEXT("我们"),是谁负责把国标码转换成Unicode的? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 代码文件也要用unicode格式,这样才能正确显示中文等,然后使用 TEXT等宏,用宽字符表示,两个字节表示一个字符 unicode用2个字节表示一个字符ansi用1个字节unicode表示字符的方法 wchar_t txt[] = L"unicode"; // 会占用 (7+1)*2个字节 ~~~~~~~ansi char txt[] = "ansi"; // ~~~~~~(4+1)*1~~~~~TEXT("xxx"), _T("xxx") 在不同的工程设置下可代表不同的字符类型。如果定义了UNICODE,则展开为unicode格式的字符串 L"xxx"; 如果没有定义,则展开为ansi格式的字符串 "xxx" 源本身有存储格式,可执行程序也分unicode/ansi 可能大家没明白我的意思,vc里,代码源文件是ascii格式的,遇到汉字用的是gb码TCHAR str[] = TEXT("我们");用UltraEdit打开源文件代码,发现"我们"用的是gb表示的,谁把gb码转换成Unicode的呢?比如MessageBoxW(NULL, str, 0, 0),结果是对的,但是这个函数要求的是Unicode,谁转换的呢? 你确信你说的都是真的?假如你的工程是unicode的,那是对的,如果没定义_UNICODE宏呢? MSDN中有个转换成宽字符的函数 在Window Xp下用 vs2008,当然定义了_UNICODE, windows2000或者windowXp都是_UNICODE了 楼主哇,俺一定不显示地声明使用哪个API,习惯不带A和W的使用方式:MessageBox这个适应性显然更好,至于是A还是W,由编译器去决定好了。字符串声明用_T(".........")就ok;而且,除非你准备你的程序跨平台使用,那用_UNICODE可以,否则,俺还是建议ANSI就ok了。有很多函数都是要求使用char,或者char*的参数。 这个适应性显然更好,至于是A还是W,由编译器去决定好了。字符串声明用_T(".........")就ok; 这个正确。。 1、源文件在VC中可以保存成Unicode格式。代码文件的处理是编译器的问题,由它进行处理。2、如果源文件是ANSI格式保存的,那么源文件中的“我们”以GB码保存,如果文件是Unicode的,以Unicode保存。3、源文件和程序是两回事。你这样调用MessageBoxW,因为在VS05以后,默认都是使用Unicode的,因此,TCHAR也是wchar_t。 如果你在VC6或者选择了多字符集编译,那么会出错。 应该是VS08默认使用Unicode字符集进行编译,即定义了_UNICODE。Windows NT系列系统如2k,2k3,xp的内核都是Unicode的,即A系列函数最后是调用W的函数。 楼主这个问题问得好,说明你很细心啊。首先,VC里代码文件不一定是ASCII的,ASCII里面只能是0~127个字符,也许按照楼上说的MBCS更正确。因为我们肯定是可以在代码里敲中文的。那么编译器是如何处理中文的呢?有两种情况,对于较新的编译器如VS.NET2008,在文件另存为的时候,Save按钮旁边会有一个下拉箭头,里面有一个Save with Encoding...菜单,可以保存为Unicode。VC6等老得编译器不好说支不支持了。那么为什么默认的不是Unicode但也可以保存中文呢,这个与Windows的区域语言设置有关,编译器按照Windows区域语言里面非Unicode程序所使用的字符编码来解析代码文件。因为我们安装的是中文操作系统,这一选项默认是中文。例如我的Vista系统显示的是:Current language for non-Unicode programs: Chinese (Simplified, PRC)。你可以做一个尝试,在区域语言是中文的情况下,编写一段简单的程序,代码文件保存成非Unicode。例如:#include "stdafx.h"#include <windows.h>int _tmain(int argc, _TCHAR* argv[]){ MessageBox(NULL, TEXT("测试"), TEXT("中文"), MB_OK); return 0;}然后将区域语言改为日文,重启电脑,打开上述程序,显示的就是乱码了。所以你的疑问恐怕是在于TEXT到底是告诉谁把什么转换成什么了,因为TEXT本身根据_UNICODE宏不同定义也不一样,所以我们不妨用L来描述吧。L"中文"是告诉编译器,在编译生成obj的时候,将"中文"转换成Unicode格式。如果.cpp文件本身就是Unicode的了,"中文"也就不需要被转换了,如果.cpp文件是ASCII的,那么编译器会根据Windows区域语言配置进行转换。 看了一些资料 TEXT("我们")在Unicode定义的情况下,相当于L"我们",就是说这个L能把GB码转换为Unicode码,但是L是C语言里的东西,在所有的编译器都好用,是不是所有的编译器对这个L定义都一样呢,就是把GB转换成Unicode。 L并不是把GB转换成Unicode,在Windows平台中,是把Windows设置中当前非Unicode程序默认编码转换为ucs2,也就是两字节的Unicode编码在*nix平台中,转换为ucs4,也就是4字节的Unicode编码。 VS2008 MFC想用到GRIDVIEW控件,但该控件是灰色的,不知该如何添加 高手来帮忙看看这个图像的PSNR的matlab程序问题在哪 VC的Picture控件怎么用啊 在windows和linux平台上获取进程运行的高精度时间 我这样简单的缩小图形的算法,为何有问题? 我搞不懂vc 1个字节的高4位和4低位进行互换,如果用循环移位的方法,具体怎么做呀? 问个简单的问题? vc,全局变量,全局函数,在哪里定义啊? 如何将skin++这类换肤库注入到其他进程中实现换肤? 清空数组里的数据 关于硬盘扇区读写的问题
然后使用 TEXT等宏,用宽字符表示,两个字节表示一个字符
ansi用1个字节unicode表示字符的方法 wchar_t txt[] = L"unicode"; // 会占用 (7+1)*2个字节
~~~~~~~
ansi char txt[] = "ansi"; // ~~~~~~(4+1)*1~~~~~TEXT("xxx"), _T("xxx") 在不同的工程设置下可代表不同的字符类型。如果定义了UNICODE,则展开为unicode格式的字符串 L"xxx"; 如果没有定义,则展开为ansi格式的字符串 "xxx"
TCHAR str[] = TEXT("我们");
用UltraEdit打开源文件代码,发现"我们"用的是gb表示的,谁把gb码转换成Unicode的呢?
比如MessageBoxW(NULL, str, 0, 0),结果是对的,但是这个函数要求的是Unicode,谁转换的呢?
你确信你说的都是真的?假如你的工程是unicode的,那是对的,如果没定义_UNICODE宏呢?
在Window Xp下用 vs2008,当然定义了_UNICODE, windows2000或者windowXp都是_UNICODE了
这个适应性显然更好,至于是A还是W,由编译器去决定好了。字符串声明用_T(".........")就ok;而且,除非你准备你的程序跨平台使用,那用_UNICODE可以,否则,俺还是建议ANSI就ok了。有很多函数都是要求使用char,或者char*的参数。
这个正确。。
1、源文件在VC中可以保存成Unicode格式。代码文件的处理是编译器的问题,由它进行处理。
2、如果源文件是ANSI格式保存的,那么源文件中的“我们”以GB码保存,如果文件是Unicode的,以Unicode保存。
3、源文件和程序是两回事。你这样调用MessageBoxW,因为在VS05以后,默认都是使用Unicode的,因此,TCHAR也是wchar_t。
如果你在VC6或者选择了多字符集编译,那么会出错。
应该是VS08默认使用Unicode字符集进行编译,即定义了_UNICODE。
Windows NT系列系统如2k,2k3,xp的内核都是Unicode的,即A系列函数最后是调用W的函数。
首先,VC里代码文件不一定是ASCII的,ASCII里面只能是0~127个字符,也许按照楼上说的MBCS更正确。因为我们肯定是可以在代码里敲中文的。
那么编译器是如何处理中文的呢?有两种情况,对于较新的编译器如VS.NET2008,在文件另存为的时候,Save按钮旁边会有一个下拉箭头,里面有一个Save with Encoding...菜单,可以保存为Unicode。VC6等老得编译器不好说支不支持了。
那么为什么默认的不是Unicode但也可以保存中文呢,这个与Windows的区域语言设置有关,编译器按照Windows区域语言里面非Unicode程序所使用的字符编码来解析代码文件。
因为我们安装的是中文操作系统,这一选项默认是中文。例如我的Vista系统显示的是:Current language for non-Unicode programs: Chinese (Simplified, PRC)。你可以做一个尝试,在区域语言是中文的情况下,编写一段简单的程序,代码文件保存成非Unicode。例如:
#include "stdafx.h"
#include <windows.h>int _tmain(int argc, _TCHAR* argv[])
{
MessageBox(NULL, TEXT("测试"), TEXT("中文"), MB_OK);
return 0;
}然后将区域语言改为日文,重启电脑,打开上述程序,显示的就是乱码了。所以你的疑问恐怕是在于TEXT到底是告诉谁把什么转换成什么了,因为TEXT本身根据_UNICODE宏不同定义也不一样,所以我们不妨用L来描述吧。
L"中文"是告诉编译器,在编译生成obj的时候,将"中文"转换成Unicode格式。
如果.cpp文件本身就是Unicode的了,"中文"也就不需要被转换了,如果.cpp文件是ASCII的,那么编译器会根据Windows区域语言配置进行转换。
L并不是把GB转换成Unicode,
在Windows平台中,是把Windows设置中当前非Unicode程序默认编码转换为ucs2,也就是两字节的Unicode编码
在*nix平台中,转换为ucs4,也就是4字节的Unicode编码。