上个问题已经结帐,大白菜我还有一个更菜的问题要问:来者有分 既然_T()的作用是转化为UNICODE, 那么什么是UNICODE呢?他又是以什么形式存在于硬盘和内存中的呢?回答越详细分就越高!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 UNICODE 是目前用来解决 ASCII 码 256 个字符限制问题的一种比较流行的解决方案。大家知道,ASCII 字符集只有256个字符,用 0-255 之间的数字来表示。包括大小写字母、数字以及少数特殊字符;如标点符号、货币符号等。对于大多数拉丁语言来说,这些字符已经够用。但是,许多亚洲和东方语言所用的字符远远不止256个字符。有些超过千个。人们为了突破 ASCII 码字符数的限制,试图用一种简单的方法来针对超过256个字符的语言编写计算机程序。于是 UNICODE 应运而生。UNICODE 通过用双字节来表示一个字符,从而在更大范围内将数字代码映射到多种语言的字符集。如果你正在用 Visual C++ 编写程序,UNICODE 兼容性意味着你的程序是否具有国际化特征,也就是说你的应用程序是针对本地市场还是国际市场。一旦你作出了决定,那么就得在代码中实现具体细节。好在 Visual C++ 提供了很多内建功能来支持 UNICODE,在创建工程时就可以利用 Visual C++ 提供的这些功能。在产生应用程序框架代码之前,AppWizard 允许开发人员决定是否支持 UNICODE。Win32 SDK 包含有一些数据类型遵循 UNICODE 编码规则,MFC 以宏的形式提供了将一般文本转换成 UNICODE 数据类型的途径。开发人员只需要稍微改变一下编写代码的习惯便可以轻松编写支持 UNICODE 的应用。 C 程序员一般是用 char 关键字象下面这样来声明一个字符串数组: char str[100]; 象下面这样声明函数原形: void strcpy( char *out, char *in ); 为了将上面的声明改成支持双字节的 UNICODE 字符集,可以用下面的方法: wchar_t str[100]; 或者 void wcscpy( wchar_t *out, wchar_t *in ); 此外,微软还提供一种通过预处理指令来实现 UNICODE。每当用 Visual C++ 创建新工程时,只要确定是否支持另外一种字符集,则 AppWizard 将会在头文件中插入预处理指令。这些指令告诉编译器程序想要支持何种字符集。这样在使用VC++提供的通用数据类型时,编译器将用相应的数据类型把通用数据类型替换成所需要支持的字符集。这样很容易将代码重新编译成支持其它字符集的程序。 为了在 Visual C++ 6.0 中激活 UNICODE 标准,可以这样做:打开工程文件后,从主菜单中选择“Project | Settings”打开工程设置对话框 => 然后选择“C/C++”标签 => 在“Preprocessor definitions”编辑框中添加 UNICODE 或者 _UNICODE 预处理宏指令。\注意这里的 UNICODE 和 _UNICODE 有什么区别呢?前者没有下划线,专门用于 Windows 头文件;后者有一个前缀下划线,专门用于 C 运行时头文件。在代码中,凡是用关键字 char 的地方都用 TCHAR 取代;凡是用 char * 的地方都用 LPTSTR 取代;凡是定义在双引号中的字符串常量(如"VCKBASE Online Journal")都用 TEXT 宏重写: TEXT("VCKBASE Online Journal"); TEXT 宏的主要作用是当定义了 UNICODE/_UNICODE 预处理指令时,字符串被标志为双字节字符串,否则字符串被标示为 ANSI 字符串。TEXT 的定义如下: TEXT( LPTSTR string // ANSI 或者 Unicode 字符串 ); 参数 string 为字符串指针,指向被解释的 Unicode 或者 ANSI 字符串在文档中 微软提供了包括通用类型在内的几种数据类型都与 ASCII 和 UNICODE兼容。这一点可以参考微软在线文档有关“通用数据类型和数据类型”的章节。 这里有一篇文章,别人写的:========================UNICODE编程这是一个许多人(包括我自己)曾经或至今仍疑惑的问题(这里我们只讨论UTF-16,即双字节版本)。1.关于UNICODE 首先,UNICODE主要使用的字符类型是WCHAR,定义是unsigned short。从定义我们可以看出这是一个双字节的类型,就是每一个字符占2个字节。这样的话,可以表示的字符类型就可以多达6万多。所有之前的ASCII码分布在0x0000-0x00ff之间,而汉字(包括big5)分布在0x4e00到0x9fff之间。整个unicode包含了几乎世界上所有的文字。关于UNICODE的细节,可以参看以下网页http://www.unicode.org/unicode/standard/translations/s-chinese.html2.为什么要使用UNICODE 1) COM:在COM规范中,明确指定了必须使用UNICODE类型,这正是微软充分考虑了跨平台的结果。这也是为什么经常在COM中可以看到BSTR(WCHAR*)类型 2)WIN2000和WINNT:在这两个平台中,默认的字符处理方式是UNICODE。即使你写了一个非UNICODE(multibyte)的程序,系统在执行的时候仍然会对你的字符进行一次转换,这样无疑浪费了CPU时间,使用UNICODE可以有效的提高程序的运行效率(仅使用于这两个平台)。当然将来的XP也会如此。 3)通用性:使用UNICODE可以使我们不在为汉字和英文字符的判断而烦恼(都是2个字节)。3.如何使用UNICODE 1)首先推荐的类型是TCHAR(通用字符类型)。当你定义了_UNICODE宏的时候,TCHAR就是WCHAR,当你没有定义这个宏的时候,TCHAR就是char,很不可思议吧,我们可以来看一下TCHAR的定义:#ifdef UNICODE // r_winnttypedef WCHAR TCHAR, *PTCHAR;#else /* UNICODE */ // r_winnttypedef char TCHAR, *PTCHAR;#endif /* !_TCHAR_DEFINED */上面的代码来自WINNT.H我剔除了一些无关的部分。现在一切都显而易见了。通过TCHAR,我们只需要这样一段代码:TCHAR tStr[] = _T("t code");MessageBox(tStr);就可以支持UNICODE和MULTIBYTE两种版本。_T宏的作用就是转换成TCHAR。2)关于其他的处理首先是常用的CString,它本身就支持UNICODE。下面的例子说明了用法:CString *pFileName = new CString("c:\\tmpfile.txt");#ifdef _UNICODEm_hFile = CreateFile(pFileName->AllocSysString(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);#elsem_hFile = CreateFile(pFileName->GetBuffer(pFileName->GetLength()), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);#endif3) 当我们在UNICODE方式中需要为一个字串常量附值时可以使用L宏,如:BSTR wcsStr = L"unicode"; 这样的附值很简便,但是,经过L宏处理后的字串一定是UNICODE,如果你吧它附给一个MULTIBYTE的字串,字符将可能会被截断。 另外,VC还提供了一些函数如WideCharToMultiByte和MultiByteToWideChar还有另外的一些宏来支持转换。大家可以看MSDN。 3.编译器的设置: 首先我们需要在project->settings->C/C++的属性页中的Preprocessor中写入_UNICODE,然后在link属性页中Category中选择output,在Entry-Point symbol 中添加wWinMainCRTStartup,这样,我们的UNICODE工程便大功告成。 我还是不大明白:UNICODE字符在内存和硬盘中的形态如何? 双字节存放。你自己定义一个宽字符的数组,然后用wsprintf存进去一个字符串,自己在VC里头断下来dump一下不就知道了么!这么简单的问题,你问来问去不如自己去探索。 windows程式设计一书有详细说明。 谁说_T()是转化为UNICODE的?他是根据系统文字编码的定义相应转化为UNICODE或者SBCS或者MBCS编码,L"asfdhjk"才是,UNICODE只是一种文字双字节编码规范,比普通的编码好的地方是可以支持多国语言,不好的地方是WIN98对UNICODE的支持很弱 学了一招,是该看看windows 程序设计了 在Petzold的Windows程序设计中有,第二章就是在第一章中,我已经预告,C语言中在Microsoft Windows程式设计中扮演著重要角色的任何部分都会讲述到,您也许在传统文字模式程式设计中还尚未遇到过这些问题。宽字元集和Unicode差不多就是这样的问题。简单地说,Unicode扩展自ASCII字元集。在严格的ASCII中,每个字元用7位元表示,或者电脑上普遍使用的每字元有8位元宽;而Unicode使用全16位元字元集。这使得Unicode能够表示世界上所有的书写语言中可能用於电脑通讯的字元、象形文字和其他符号。Unicode最初打算作为ASCII的补充,可能的话,最终将代替它。考虑到ASCII是电脑中最具支配地位的标准,所以这的确是一个很高的目标。..... 上面已经回答得很详细了,我进来一是来学习,二是来说说我的理解1.unicode是双字节,而ASCII码是单字节,所以所能表示的字符数肯定不同。2.win2k以前都是用ASCII编码,win2k以后都是UNICODE编码,所以编写程序时应该注意,如果要编写一个在各种windows平台上运行的程序,就要注意考虑分开处理3.有两个转换函数,MultiByteToWideChar(),WideCharToMultiByte(),楼主可能有用得着的时候,呵呵呵呵,好了,就先说这么多了,呵呵 音视频聊天通讯开源项目 如何获取远程文件的图标? 要疯了,我曰(YUE) ie打开文件的问题,大家忙帮看看 C++问题,关于静态,友元函数 dx问题:错误 ”createsurface for texture failed“是什么原因啊? 关于视频流的问题 看一看,这是什么错误 文件输出的问题!非常的急!!! 如何改变应用程序的图标 我刚学VC一星期,这么简单的程序也会错? 一个关于函数返回指针的问题!·
象下面这样声明函数原形: void strcpy( char *out, char *in ); 为了将上面的声明改成支持双字节的 UNICODE 字符集,可以用下面的方法: wchar_t str[100];
或者
void wcscpy( wchar_t *out, wchar_t *in );
此外,微软还提供一种通过预处理指令来实现 UNICODE。每当用 Visual C++ 创建新工程时,只要确定是否支持另外一种字符集,则 AppWizard 将会在头文件中插入预处理指令。这些指令告诉编译器程序想要支持何种字符集。这样在使用VC++提供的通用数据类型时,编译器将用相应的数据类型把通用数据类型替换成所需要支持的字符集。这样很容易将代码重新编译成支持其它字符集的程序。
为了在 Visual C++ 6.0 中激活 UNICODE 标准,可以这样做:打开工程文件后,从主菜单中选择“Project | Settings”打开工程设置对话框 => 然后选择“C/C++”标签 => 在“Preprocessor definitions”编辑框中添加 UNICODE 或者 _UNICODE 预处理宏指令。\注意这里的 UNICODE 和 _UNICODE 有什么区别呢?前者没有下划线,专门用于 Windows 头文件;后者有一个前缀下划线,专门用于 C 运行时头文件。
在代码中,凡是用关键字 char 的地方都用 TCHAR 取代;凡是用 char * 的地方都用 LPTSTR 取代;凡是定义在双引号中的字符串常量(如"VCKBASE Online Journal")都用 TEXT 宏重写: TEXT("VCKBASE Online Journal");
TEXT 宏的主要作用是当定义了 UNICODE/_UNICODE 预处理指令时,字符串被标志为双字节字符串,否则字符串被标示为 ANSI 字符串。TEXT 的定义如下:
TEXT(
LPTSTR string // ANSI 或者 Unicode 字符串
);
参数 string 为字符串指针,指向被解释的 Unicode 或者 ANSI 字符串
在文档中 微软提供了包括通用类型在内的几种数据类型都与 ASCII 和 UNICODE兼容。这一点可以参考微软在线文档有关“通用数据类型和数据类型”的章节。
========================UNICODE编程
这是一个许多人(包括我自己)曾经或至今仍疑惑的问题(这里我们只讨论UTF-16,即双字节版本)。
1.关于UNICODE
首先,UNICODE主要使用的字符类型是WCHAR,定义是unsigned short。从定义我们可以看出这是一个双字节的类型,就是每一个字符占2个字节。这样的话,可以表示的字符类型就可以多达6万多。所有之前的ASCII码分布在0x0000-0x00ff之间,而汉字(包括big5)分布在0x4e00到0x9fff之间。整个unicode包含了几乎世界上所有的文字。关于UNICODE的细节,可以参看以下网页
http://www.unicode.org/unicode/standard/translations/s-chinese.html
2.为什么要使用UNICODE
1) COM:在COM规范中,明确指定了必须使用UNICODE类型,这正是微软充分考虑了跨平台的结果。这也是为什么经常在COM中可以看到BSTR(WCHAR*)类型
2)WIN2000和WINNT:在这两个平台中,默认的字符处理方式是UNICODE。即使你写了一个非UNICODE(multibyte)的程序,系统在执行的时候仍然会对你的字符进行一次转换,这样无疑浪费了CPU时间,使用UNICODE可以有效的提高程序的运行效率(仅使用于这两个平台)。当然将来的XP也会如此。
3)通用性:使用UNICODE可以使我们不在为汉字和英文字符的判断而烦恼(都是2个字节)。
3.如何使用UNICODE
1)首先推荐的类型是TCHAR(通用字符类型)。当你定义了_UNICODE宏的时候,TCHAR就是WCHAR,当你没有定义这个宏的时候,TCHAR就是char,很不可思议吧,我们可以来看一下TCHAR的定义:
#ifdef UNICODE // r_winnt
typedef WCHAR TCHAR, *PTCHAR;
#else /* UNICODE */ // r_winnt
typedef char TCHAR, *PTCHAR;
#endif /* !_TCHAR_DEFINED */
上面的代码来自WINNT.H我剔除了一些无关的部分。现在一切都显而易见了。
通过TCHAR,我们只需要这样一段代码:
TCHAR tStr[] = _T("t code");
MessageBox(tStr);
就可以支持UNICODE和MULTIBYTE两种版本。_T宏的作用就是转换成TCHAR。
2)关于其他的处理
首先是常用的CString,它本身就支持UNICODE。下面的例子说明了用法:
CString *pFileName = new CString("c:\\tmpfile.txt");
#ifdef _UNICODE
m_hFile = CreateFile(pFileName->AllocSysString(),
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
#else
m_hFile = CreateFile(pFileName->GetBuffer(pFileName->GetLength()),
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
#endif
3) 当我们在UNICODE方式中需要为一个字串常量附值时可以使用L宏,如:
BSTR wcsStr = L"unicode";
这样的附值很简便,但是,经过L宏处理后的字串一定是UNICODE,如果你吧它附给一个MULTIBYTE的字串,字符将可能会被截断。
另外,VC还提供了一些函数如WideCharToMultiByte和MultiByteToWideChar还有另外的一些宏来支持转换。大家可以看MSDN。 3.编译器的设置:
首先我们需要在project->settings->C/C++的属性页中的Preprocessor中写入_UNICODE,然后在link属性页中Category中选择output,在Entry-Point symbol 中添加wWinMainCRTStartup,这样,我们的UNICODE工程便大功告成。
你自己定义一个宽字符的数组,然后用wsprintf存进去一个字符串,自己在VC里头断下来dump一下不就知道了么!这么简单的问题,你问来问去不如自己去探索。
简单地说,Unicode扩展自ASCII字元集。在严格的ASCII中,每个字元用7位元表示,或者电脑上普遍使用的每字元有8位元宽;而Unicode使用全16位元字元集。这使得Unicode能够表示世界上所有的书写语言中可能用於电脑通讯的字元、象形文字和其他符号。Unicode最初打算作为ASCII的补充,可能的话,最终将代替它。考虑到ASCII是电脑中最具支配地位的标准,所以这的确是一个很高的目标。.....
1.unicode是双字节,而ASCII码是单字节,所以所能表示的字符数肯定不同。
2.win2k以前都是用ASCII编码,win2k以后都是UNICODE编码,所以编写程序时应该注意,如果要编写一个在各种windows平台上运行的程序,就要注意考虑分开处理
3.有两个转换函数,MultiByteToWideChar(),WideCharToMultiByte(),楼主可能有用得着的时候,呵呵
呵呵,好了,就先说这么多了,呵呵