_T _TEXT TEXT, _UNICODE UNICODE辨析

ForestDB 2010-04-11 12:26:12
就标题中的这些宏吧,谁能够给出辨析。

(最近看Windows编程,MSDN,自己心里有了个初步的认知,但是想看看大牛们的见解。)
...全文
404 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
janery1290 2010-05-12
  • 打赏
  • 举报
回复
收益了........
liumenghappy 2010-04-13
  • 打赏
  • 举报
回复
VC 中与字符串相关的宏 _T、TEXT,_TEXT、L 的作用

一、 在字符串前加一个L作用:
如 L"我的字符串" 表示将ANSI字符串转换成unicode的字符串,就是每个字符占用两个字节。
strlen("asd") = 3;
strlen(L"asd") = 6;

二、 _T宏可以把一个引号引起来的字符串,根据你的环境设置,使得编译器会根据编译目标环境选择合适的(Unicode还是ANSI)字符处理方式
如果你定义了UNICODE,那么_T宏会把字符串前面加一个L。这时 _T("ABCD") 相当于 L"ABCD" ,这是宽字符串。
如果没有定义,那么_T宏不会在字符串前面加那个L,_T("ABCD") 就等价于 "ABCD"

三、TEXT,_TEXT 和_T 一样的

如下面三语句:
TCHAR szStr1[] = TEXT("str1");
char szStr2[] = "str2";
WCHAR szStr3[] = L("str3");
那么第一句话在定义了UNICODE时会解释为第三句话,没有定义时就等于第二句话。
但二句话无论是否定义了UNICODE都是生成一个ANSI字符串,而第三句话总是生成UNICODE字符串。
为了程序的可移植性,建议都用第一种表示方法。
但在某些情况下,某个字符必须为ANSI或UNICODE,那就用后两种方法。


TEXT宏的好处在于,在编译器定义了UNICODE的情况下, 会自动将字符串变为unicode, 而没有定义的情况下, 则会变为ANSI字符串. 所以在常量字符串前使用TEXT宏, 可以在以后改变编译环境时无需改动代码!
这不是鸭头 2010-04-12
  • 打赏
  • 举报
回复
学习...
visualassist4680 2010-04-12
  • 打赏
  • 举报
回复
就是处理unicode 和ansi 字符的宏定义,一个是c/c++ 运行时库的定义,一个是windows的定义,完成的功能是一样的,只不过是两个环境的不同定义方式
I_NBFA 2010-04-12
  • 打赏
  • 举报
回复
_T _TEXT TEXT作用都一样, 还有__TEXT __T.....
不过最好使用MSDN里公开的, 不然以后也许会出现兼容问题.
UNICODE用来控制windows函数原形, 而_UNICODE用来控制CRT的函数原形.
ForestDB 2010-04-12
  • 打赏
  • 举报
回复
再顶。
jogger007 2010-04-12
  • 打赏
  • 举报
回复
我来看大牛的见解的。。。
wangli820 2010-04-12
  • 打赏
  • 举报
回复
Windows核心编程有说明,定义 UNICODE 与 _UNICODE 后,要同时定义这2个宏.可保证编译代码时用UNICODE的环境.
定义了2个UNICODE宏后,与ASCII环境不同的是.在处理字符的时候,把字符型的数据看成是unsigned short而非char,因为在UNICODE的编码里,字符都是16位的,所以定义成unsigned short后处理更方便.

而 _T TEXT 这类的类型定义,是为了方便我们写出通用的代码,无论是ASCII与UNICODE环境都可通用.
还有TCHAR LPTSTR这些宏也是同样的目的.

原理是这样的.
首先_T _TEXT TEXT 的意思是一样的.
如果有 UNICODE 的定义则
TEXT("abc") 解释成 L"abc" 意思是字符串"abc" 的类型为 unsigned shotr的数组,字符a,b,c都占16字节的了.
如果没有定义UNICODE的话
TEXT("abc") 就解释成 "abc" 与我们平时接触的一样 "abc" 类型为 char 的数组.

很多时会见到 TCHAR ch;这样的定义.
也是同样的,如果有UNICODE, TCHAR 就是 unsigned shotr,而没有定义UNICODE时,TCHAR就解释为char了,这样我们写的代码,就可以通用于UNICOODE与ASCII的环境.

当然我们可以这样做的前提是,WINDOWS的函数也是定义了UNICODE与ASCII两个版本的.
如果有UNICODE时,函数名会为xxxxW,且接受的字符型参数也是unsigned short的.
如果没有UNICODE,函数名会为xxxxA,接受的字符型参数会是char的.

如果碰到了一些没有为UNICODE设计的代码,参数只是char,而我们却传了TCHAR,而刚好又定义了UNICODE的宏,那么我们的TCHAR参数传给char也是会错的.

就是说如果我们面对的是UNICODE与ASCII通用的函数时,我们应该用TCHAR.
时当面对一些不是通用的,就不要用TCHAR.

MSDN的函数都会有说明,参数是TCHAR或char的.
用户 昵称 2010-04-12
  • 打赏
  • 举报
回复
要明白文字与编码的关系,文字是固定的,编码是任意的,正因为编码是任意的,所以才出了个统一的unicode。
wltg2001 2010-04-11
  • 打赏
  • 举报
回复
_UNICODE与UNICODE这两个是用来决定代码用ANSI还是用UNICODE进行编译的两个宏,加了这两个就用UNICODE进行编译,不加就用ANSI编译。_UNICODE用于C运行时头文件,而UNICODE是用于Win32头文件的,一般如果用UNICODE的话,两个都要用的。
_T宏是与_UNICODE宏相关的,如果你定义了_UNICODE,那么_T宏会把字符串前面加一个L。这时 _T("ABCD") 相当于 L"ABCD" ,这是宽字符串。如果没有定义,那么_T宏不会在字符串前面加那个L,_T("ABCD") 就等价于 "ABCD"
_TEXT和_T应该是一样的吧
zyq5945 2010-04-11
  • 打赏
  • 举报
回复
// 如果定义了UNICODE宏,在tchar.h头文件中
#define _T(x) __T(x)
#define _TEXT(x) __T(x)
#define __T(x) L ## x //连接字符串,比如x为"This is test!",连接成L"This is test!"
_UNICODE宏用于C运行期头文件,而UNICODE宏则用于Windows头文件
田暗星 2010-04-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wltg2001 的回复:]
_UNICODE与UNICODE这两个是用来决定代码用ANSI还是用UNICODE进行编译的两个宏,加了这两个就用UNICODE进行编译,不加就用ANSI编译。_UNICODE用于C运行时头文件,而UNICODE是用于Win32头文件的,一般如果用UNICODE的话,两个都要用的。
_T宏是与_UNICODE宏相关的,如果你定义了_UNICODE,那么_T宏会把字符串前面加一个L。这时 _T("……
[/Quote]

很有道理
nostopping 2010-04-11
  • 打赏
  • 举报
回复
刚开始对这概念也是很模糊,不过用多了就渐渐清晰了。
现在处理字符时习惯加_T()了,然后处理字符串的函数也使用在UNICONDE和ANSI间自动转换的函数,所有的这些函数都可以在MSDN里找到:generic-text mappings -> Routine Mappings
gamedragon 2010-04-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 forestdb 的回复:]
F12进入的话无外乎就是char或者wchar_t(unsinged short),
而我想知道的是个概念模型,就是Windows是以怎样的思路来组织这些个概念的。
[/Quote]
这个东西没啥概念,就是一个预定义的宏,给预编译器用的。
因为Win32 API以前只提供ANSI版本,后来就多了UNICODE版本,但为了和以前保持兼容,就搞了这么套东西。你编译程序的时候指定了UNICODE,编译出来的就是UNICODE版本,否则就是ANSI版本。
Eleven 2010-04-11
  • 打赏
  • 举报
回复
_T, TEXT等等都是定义的宏,根据当前工程是多字节编码还是Unicode编码来确定是使用ASNI字符串还是Unicode字符串。。。
ForestDB 2010-04-11
  • 打赏
  • 举报
回复
LS的看得我眼花缭乱
(不是帖子,是星星)
finder_zhang 2010-04-11
  • 打赏
  • 举报
回复
Windows核心编程有说明,定义 UNICODE 与 _UNICODE 后,要同时定义这2个宏.可保证编译代码时用UNICODE的环境.
定义了2个UNICODE宏后,与ASCII环境不同的是.在处理字符的时候,把字符型的数据看成是unsigned short而非char,因为在UNICODE的编码里,字符都是16位的,所以定义成unsigned short后处理更方便.

而 _T TEXT 这类的类型定义,是为了方便我们写出通用的代码,无论是ASCII与UNICODE环境都可通用.
还有TCHAR LPTSTR这些宏也是同样的目的.

原理是这样的.
首先_T _TEXT TEXT 的意思是一样的.
如果有 UNICODE 的定义则
TEXT("abc") 解释成 L"abc" 意思是字符串"abc" 的类型为 unsigned shotr的数组,字符a,b,c都占16字节的了.
如果没有定义UNICODE的话
TEXT("abc") 就解释成 "abc" 与我们平时接触的一样 "abc" 类型为 char 的数组.

很多时会见到 TCHAR ch;这样的定义.
也是同样的,如果有UNICODE, TCHAR 就是 unsigned shotr,而没有定义UNICODE时,TCHAR就解释为char了,这样我们写的代码,就可以通用于UNICOODE与ASCII的环境.

当然我们可以这样做的前提是,WINDOWS的函数也是定义了UNICODE与ASCII两个版本的.
如果有UNICODE时,函数名会为xxxxW,且接受的字符型参数也是unsigned short的.
如果没有UNICODE,函数名会为xxxxA,接受的字符型参数会是char的.

如果碰到了一些没有为UNICODE设计的代码,参数只是char,而我们却传了TCHAR,而刚好又定义了UNICODE的宏,那么我们的TCHAR参数传给char也是会错的.

就是说如果我们面对的是UNICODE与ASCII通用的函数时,我们应该用TCHAR.
时当面对一些不是通用的,就不要用TCHAR.

MSDN的函数都会有说明,参数是TCHAR或char的.
oyljerry 2010-04-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 forestdb 的回复:]
F12进入的话无外乎就是char或者wchar_t(unsinged short),
而我想知道的是个概念模型,就是Windows是以怎样的思路来组织这些个概念的。
[/Quote]
windows就是根据不同的字符集来使用不同的编码字符串,当字符集是多字节时,就用ansi 字符串,unicode编码时,就是unicode字符串
ForestDB 2010-04-11
  • 打赏
  • 举报
回复
顶一下。
ForestDB 2010-04-11
  • 打赏
  • 举报
回复
F12进入的话无外乎就是char或者wchar_t(unsinged short),
而我想知道的是个概念模型,就是Windows是以怎样的思路来组织这些个概念的。
加载更多回复(2)

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧