VC中_T("")与L区别

区别解释

一说这个话题,肯定涉及MS的字符集,先看MS对_T(其中_TEXT(")与_T("")一样)的定义:

[cpp] view plaincopy
  1. #define _T(x)       __T(x)
  2. #define _TEXT(x)    __T(x)

如果定义了_UNICODE标识符,那么一个称作__T的宏就定义如下:

[cpp] view plaincopy
  1. #define __T(x) L##x

如果没有定义_UNICODE标识符,则__T宏只简单地定义如下:

[cpp] view plaincopy
  1. #define __T(x) x

举个例子,可以明白:

[cpp] view plaincopy
  1. CString str = _T("12345");

在非 UNICODE 工程下等于:

[cpp] view plaincopy
  1. CString str = "12345";

在 UNICODE 工程下等于:

[cpp] view plaincopy
  1. CString str = L"12345";

这个在编译时就决定了,其实就是个宏替换。

L是表示Unicode
_T可以是UNICODE,也可以是ANSI,这要看编译设置。

_T会根据你工程的设置自动转换UNICODE和非UNICODE,加L就是转为UNICODE。

VC6.0设定UNICODE编译环境可以参考:http://blog.csdn.net/zyw_anquan/article/details/8363484

================================================================

下面给出一个问题集锦(转自网络,作了部分修改:http://bbs.csdn.net/topics/394962):

Unicode :宽字节字符集

1. 如何取得一个既包含单字节字符又包含双字节字符的字符串的字符个数?

可以调用Microsoft Visual C++的运行期库包含函数_mbslen来操作多字节(既包括单字节也包括双字节)字符串。而调用strlen函数,无法真正了解字符串中究竟有多少字符,它只能告诉你到达结尾的0之前有多少个字节。

2. 如何对DBCS(双字节字符集)字符串进行操作?

函数描述:

[cpp] view plaincopy
  1. PTSTR CharNext ( LPCTSTR );//返回字符串中下一个字符的地址
  2. PTSTR CharPrev ( LPCTSTR, LPCTSTR );// 返回字符串中上一个字符的地址
  3. BOOL IsDBCSLeadByte( BYTE );//如果该字节是DBCS字符的第一个字节,则返回非0值

3. 为什么要使用Unicode?

优点:

(1) 可以很容易地在不同语言之间进行数据交换。
(2) 使你能够分配支持所有语言的单个二进制.exe文件或DLL文件。
(3) 提高应用程序的运行效率。

Windows 2000是使用Unicode从头进行开发的,如果调用任何一个Windows函数并给它传递一个ANSI字符串,那么系统首先要将字符串转换成Unicode,然后将Unicode字符串传递给操作系统。如果希望函数返回ANSI字符串,系统就会首先将Unicode字符串转换成ANSI字符串,然后将结果返回给你的应用程序。进行这些字符串的转换需要占用系统的时间和内存。通过从头开始用Unicode来开发应用程序,就能够使你的应用程序更加有效地运行。
        Windows CE 本身就是使用Unicode的一种操作系统,完全不支持ANSI Windows函数。
        Windows 98 只支持ANSI,只能为ANSI开发应用程序。
        Microsoft公司将COM从16位Windows转换成Win32时,公司决定需要字符串的所有COM接口方法都只能接受Unicode字符串。

4. 如何编写Unicode源代码?

Microsoft公司为Unicode设计了WindowsAPI,这样,可以尽量减少代码的影响。实际上,可以编写单个源代码文件,以便使用或者不使用Unicode来对它进行编译。只需要定义两个宏(UNICODE和_UNICODE),就可以修改然后重新编译该源文件。_UNICODE宏用于C运行期头文件,而UNICODE宏则用于Windows头文件。当编译源代码模块时,通常必须同时定义这两个宏。

5. Windows定义的Unicode数据类型有哪些?

数据类型说明:

[cpp] view plaincopy
  1. WCHAR //Unicode字符
  2. PWSTR //指向Unicode字符串的指针
  3. PCWSTR //指向一个恒定的Unicode字符串的指针

对应的ANSI数据类型为:CHAR,LPSTR和LPCSTR。

ANSI/Unicode通用数据类型为:TCHAR,PTSTR,LPCTSTR。

6. 如何对Unicode进行操作?

字符集特性实例:

ANSI 操作函数以str开头 strcpy
Unicode 操作函数以wcs开头 wcscpy
MBCS 操作函数以_mbs开头 _mbscpy
ANSI/Unicode 操作函数以_tcs开头 _tcscpy(C运行期库)
ANSI/Unicode 操作函数以lstr开头 lstrcpy(Windows函数)
所有新的和未过时的函数在Windows2000中都同时拥有ANSI和Unicode两个版本。ANSI版本函数结尾以A表示;Unicode版本函数结尾以W表示。Windows会如下定义:

[cpp] view plaincopy
  1. #ifdef UNICODE
  2. #define CreateWindowEx CreateWindowExW
  3. #else
  4. #define CreateWindowEx CreateWindowExA
  5. #endif // !UNICODE

7. 如何表示Unicode字符串常量?

字符集实例(跟上述事例类似):

ANSI “string”
Unicode L“string”

ANSI/Unicode T(“string”)或_TEXT(“string”)

if( szError[0] == _TEXT(‘J’) ){ }

8. 为什么应当尽量使用操作系统函数?

这将有助于稍稍提高应用程序的运行性能,因为操作系统字符串函数常常被大型应用程序比如操作系统的外壳进程Explorer.exe所使用。由于这些函数使用得很多,因此,在应用程序运行时,它们可能已经被装入RAM。

如:StrCat,StrChr,StrCmp和StrCpy等。

9. 如何编写符合ANSI和Unicode的应用程序?

(1) 将文本串视为字符数组,而不是chars数组或字节数组。

(2) 将通用数据类型(如TCHAR和PTSTR)用于文本字符和字符串。
(3) 将显式数据类型(如BYTE和PBYTE)用于字节、字节指针和数据缓存。
(4) 将TEXT宏用于原义字符和字符串。
(5) 执行全局性替换(例如用PTSTR替换PSTR)。
(6) 修改字符串运算问题。例如函数通常希望在字符中传递一个缓存的大小,而不是字节。这意味着不应该传递sizeof(szBuffer),而应该传递(sizeof(szBuffer)/sizeof(TCHAR)。另外,如果需要为字符串分配一个内存块,并且拥有该字符串中的字符数目,那么请记住要按字节来分配内存。这就是说,应该调用malloc(nCharacters *sizeof(TCHAR)),而不是调用malloc(nCharacters)。

10. 如何对字符串进行有选择的比较?

通过调用CompareString来实现。

标志含义
NORM_IGNORECASE 忽略字母的大小写
NORM_IGNOREKANATYPE 不区分平假名与片假名字符
NORM_IGNORENONSPACE 忽略无间隔字符
NORM_IGNORESYMBOLS 忽略符号
NORM_IGNOREWIDTH 不区分单字节字符与作为双字节字符的同一个字符
SORT_STRINGSORT 将标点符号作为普通符号来处理

11. 如何判断一个文本文件是ANSI还是Unicode?

判断如果文本文件的开头两个字节是0xFF和0xFE,那么就是Unicode,否则是ANSI。

12. 如何判断一段字符串是ANSI还是Unicode?

IsTextUnicode进行判断。IsTextUnicode使用一系列统计方法和定性方法,以便猜测缓存的内容。由于这不是一种确切的科学方法,因此IsTextUnicode有可能返回不正确的结果。

13. 如何在Unicode与ANSI之间转换字符串?

Windows函数MultiByteToWideChar用于将多字节字符串转换成宽字符串;函数WideCharToMultiByte将宽字符串转换成等价的多字节字符串。

转载于:https://www.cnblogs.com/shinecox/archive/2013/04/23/3038785.html

VC中_T()与L区别(转)相关推荐

  1. vc中ASSERT()和VERIFY()区别

    vc中ASSERT()和VERIFY()区别 (2010-03-27 22:24:53) 转载▼ 标签: 杂谈   1  ASSERT与VERIFY宏在Debug模式下作用基本一致,二者都对表达式的值 ...

  2. Windows 中_T和L

    _T("")是一个宏,定义于tchar.h下.[1] #define _T(x) _ _T(x) #ifdef  _UNICODE #define _ _T(x) L ## x ...

  3. VS编程中_T与L的区别

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

  4. VC中_T()的作用

    Windows使用两种字符集ANSI和UNICODE, 前者就是通常使用的单字节方式,但这种方式处理象中文这样的双字节字符不方便,容易出现半个汉字的情况. 而后者是双字节方式,方便处理双字节字符. W ...

  5. VC++中GlobalAlloc()、malloc()和new()函数之间区别

    VC++中GlobalAlloc().malloc()和new()函数都可以用来实现内存的动态分配,那么它们之间有什么区别呢? 三者的区别主要有以下几点: 1.GlobalAlloc()函数在程序的堆 ...

  6. VC中MessageBox与AfxMessageBox用法与区别

    一.MessageBox()用法 1.函数原型 Messagebox函数在Win32 API和MFC里的定义有区别. Win32 API的定义如下: int WINAPI MessageBox(HWN ...

  7. VC中debug和release版本的区别

    vc中debug和release的不同 收藏  在使用VC开发软件的过程中,正当要享受那种兴奋的时候突然发现:release与debug运行结果不一致,甚至出错,而release又不方便调试,真的是当 ...

  8. 浅谈Python和VC中的编码问题(转)

    以前编码问题总能让自己凑或蒙过去,最近要做一个项目服务器端用python写,客户端用c++,工程编译的字符集使用UNICODE.之间通过socket进行通信,通信过程中编码转换问题把我搞得晕头转向,逼 ...

  9. VC中的宏 (#define) 与预处理 (#if/#ifdef/#pragma) 的使用方法总结。

    C/C++ 预定义宏 例子:C/C++ 预定义宏的取值 C/C++ 预定义宏用途:诊断与调试输出 CRT 的诊断与调试输出:assert, _ASSERT/_ASSERTE, _RPTn/_RPTFn ...

最新文章

  1. 【最新】南京大学人工智能学院《模式识别》课程PPT
  2. 死磕Java并发:深入分析ThreadLocal
  3. .NET Pet Shop 4.0案例研究预览篇
  4. vscode 设置保存格式化,当保存时,单引号变成了双引号,vue项目报错
  5. 开红数显示服务器为空,网维大师常见问题:图标空白或红号问号
  6. android导航栏高度开启,如何在Android中真正获得导航栏高度
  7. mybatis基于注解(三)
  8. PHP期望T_PAAMAYIM_NEKUDOTAYIM?
  9. mysql initialsize,单机数据库优化
  10. php flash斗地主,flash斗地主
  11. iperf 服务端发送数据_iperf 流量测试
  12. 2020-08-31第一次机器人课
  13. rabbit的安装配置过程
  14. Windows Print Spooler远程代码执行漏洞复现(CVE-2021-1675)
  15. 自燃、断轴、失控,新能源车还能买吗?
  16. 工业交换机的单模多模是什么意思?
  17. MATLAB中的左除和右除
  18. JavaScript 原型链总结(一)
  19. 市面最经典的中文版需求分析说明书模板 详细讲解各目录含义 分离需求说明和需求分析
  20. 中医移动医疗_搜狗切入移动医疗领域 推中医识方APP

热门文章

  1. Tomcat新版本旧版本下载(Windows和Linux)
  2. 【Flink】Flink kafka Spark 如何实现数据有序性
  3. 95-10-035-启动-Metrics
  4. 【IDEA】IDEA git log 点击 没有代码变更
  5. java基础工具VisualVM介绍与详细使用
  6. SpringBoot : 注解@Resource
  7. 基于Docker部署LNMP架构
  8. 多线程中的事务回滚,你真的用对了吗?
  9. 一款强大的IDEA插件,帮你实现多人远程编程!
  10. Kafka是什么、主要应用在什么场景?