1. 程式人生 > >引用LPSTR、LPCSTR、LPTSTR、LPCTSTR、LPWSTR及LPCWSTR的意義及區別(轉載)

引用LPSTR、LPCSTR、LPTSTR、LPCTSTR、LPWSTR及LPCWSTR的意義及區別(轉載)

1、ANSI(即MBCS):為多位元組字符集,它是不定長表示世界文字的編碼方式。ANSI表示英文字母時就和ASCII一樣,但表示其他文字時就需要用多位元組。

2、Unicode:用兩個位元組表示一個字元的編碼方式。比如字元'A'在ASCII下面用一個位元組表示,而在Unicode下面用兩個位元組表示,其中高位元組用"0"填充;函式'程'在ASCII下面用兩個位元組表示,而在Unicode下面也是用兩個位元組表示。Unicode的用處就是定長表示世界文字,據統計,用兩個位元組可以編碼現存的所有文字而沒有二義。

3、Windows下的程式設計可以支援ANSI和Unicode兩種編碼方法的字串,具體使用哪種就要看定義了MBCS巨集還是Unicode巨集。MBCS巨集對應的字串指標為LPSTR(即char*),Unicode對應的指標為LPWSTR(即unsigned char*)。為了寫程式的方便,微軟定義了型別LPTSTR,在MBCS下它表示char*,在Unicode下它表示unsigned char*,這就可以重定義一個巨集進行不同字符集的轉換了。

4、關係

  LPSTR: 32bit指標 指向一個字串,每個字元佔1位元組。 相當於 char *
  
  LPCSTR: 32-bit指標 指向一個常字串,每個字元佔1位元組。 相當於 const char *
  
  LPTSTR: 32-bit指標 每字元可能佔1位元組或2位元組,取決於Unicode是否定義
  
  LPCTSTR:32-bit指標 指向一個常字串,每字元可能佔1位元組或2位元組,取決於Unicode是否定義
  
  LPWSTR: 32-bit指標,指向一個unicode字串的指標,每個字元佔2位元組。 

  LPCWSTR:32-bit指標, 指向一個unicode字串常量的指標,每個字元佔2位元組。 

  在上面的型別中,L表示long, P表示指標,C表示constant, T表示指標指向的字元佔的位元組數取決於Unicode是否定義,W表示wide,STR就是string的意思
  
  LPSTR = char *
  LPCSTR = const char *
  
  LPTSTR = _TCHAR * (或 TCHAR *)
  LPCTSTR = const _TCHAR * (或 const TCHAR *)
  
  LPWSTR = wchar_t *
  LPCWSTR = const wchar_t *
5、Windows使用兩種字符集ANSI和Unicode,前者在處理英文字元時使用單位元組方式,在處理中文字元時使用雙位元組方式。後者不管是英文字元還是中文字元都是採用雙位元組方式表示。Windows NT的所有與字元有關的函式都提供了兩種方式的版本,而Windows 9x只支援ANSI方式。_T一般同字元常量相關,如_T("你好!");。如果編碼方式為ANSI,_T不起任何作用;如果編碼方式為Unicode,編譯器會把"你好!"以

Unicode方式進行儲存。_T和_L的區別在於,_L不管你是以什麼方式編譯,一律以Unicode方法儲存。

6、L表示字串資源採用Unicode編碼方式,示例如下:

wchar_t Str[]=L"Hello World!"; //每個字元都用2個位元組來儲存

7、_T是一個適配巨集。當定義了_UNICODE時,_T和L相同;否則,_T的字串採用ANSI編碼方式。示例如

下:

LPTSTR lptStr=new TCHAR[32];

TCHAR* szBuf=_T("Hello");

以上兩個語句,無論是在ANSI編碼方式,還是在Unicode編碼方式下都是正確的。

8、微軟推薦使用相匹配的字串函式。例如,在處理LPTSTR或LPCTSTR的時候,應該使用_tcslen來替代strlen函式。否則,在Unicode編碼方式下,strlen不能處理wchar_t*的字串。

9、T是一個非常重要的符號(TCHAR、LPTSTR、LPCTSTR、_T()和_TEXT()等),它表示使用一箇中間型別,既不明確表示使用MBCS,也不明確表示使用Unicode。到底使用哪種字符集,在編譯的時候才決定。

10、注意L 和 _T 的使用方法。
  
  LPTSTR, LPCTSTR, 及_T(常量字串) 受_T 影響。
  
  介紹字串型別:char, wchar_t, TCHAR, CHAR, WCHAR.
  
  TCHAR 的定義:
  
  #ifdef UNICODE
   typedef wchar_t TCHAR;
  
  #else
   typedef unsigned char TCHAR;
  
  #endif
  
  
  typedef unsigned char CHAR;
  typedef unsigned wchar_t WCHAR;
  
  由此可以看出,unsigned char 和 wchar_t 都是基本資料型別, CHAR實施上就是unsigned char, WCHAR為wchar_t ,而TCHAR根據是否支援unicode而不同。
  
  在程式中,可以用的名稱有5種,unsigned char(CHAR), wchar_t(WCHAR), TCHAR, 但為了擴充套件性和相容性,推薦使用TCHAR.//

相關推薦

引用LPSTRLPCSTRLPTSTRLPCTSTRLPWSTRLPCWSTR意義區別(轉載)

1、ANSI(即MBCS):為多位元組字符集,它是不定長表示世界文字的編碼方式。ANSI表示英文字母時就和ASCII一樣,但表示其他文字時就需要用多位元組。 2、Unicode:用兩個位元組表示一個字元的編碼方式。比如字元'A'在ASCII下面用一個位元組表示,而在Unic

VC++ 字符串DwordLPSTRLPWSTRLPCSTRLPCWSTRLPTSTRLPCTSTR

width order pst lpcstr div 轉換方法 dword 字符 wchar_t 類 型 MBCS UNICODE TCHAR char   char WCHAR wchar_t wchar_t LPSTR c

LPTSTRLPCSTRLPCTSTRLPSTR的來源意義

UNICODE:它是用兩個位元組表示一個字元的方法。比如字元'A'在ASCII下面是一個字元,可'A'在UNICODE下面是兩個字元,高字元用0填充,而且漢字'程'在ASCII下面是兩個位元組,而在UNICODE下仍舊是兩個位元組。UNICODE的用處就是定長表示世界文字,據

EF基礎知識小記六(使用Code First建模自引用關系,常用於系統菜單文件目錄等有層級之分的實體)

-1 一個數 div 基礎知識 text col 菜單 hasmany roo 日常開發中,經常會碰到一些自引用的實體,比如系統菜單、目錄實體,這類實體往往自己引用自己,所以我們必須學會使用Code First來建立這一類的模型. 以下是自引用表的數據庫關系圖: ok,下

1.Java基礎之識別符號命名法八大基本資料型別三大引用型別運算子以及程式分支結構方法的定義過載遞迴

一、基礎匯入: 1.java採用Unicode編碼,16進位制編碼,支援世界上所有語言(GBK,gb2312,Unicode,UTF-8,ISO-8859-1)。 多執行緒---> c-編譯型語言 Test.java--原始檔,原始檔必須與主類名(public class Test

block使用小結在arc中使用block如何防止迴圈引用

使用block已經有一段時間了,感覺自己瞭解的還行,但是幾天前看到CocoaChina上一個關於block的小測試主題 : 【小測試】你真的知道blocks在Objective-C中是怎麼工作的嗎?,發現竟然做錯了幾道, 才知道自己想當然的理解是錯誤的,所以抽時間學習了下,並且通過一些測試程式碼進行測試

JavaScript基礎——引用型別(二)日期型別Date正則表示式型別RegExp

Date型別 ECMAScript中的Date型別是在早期Java中的java.util.Date類基礎上構建的。為此,Date型別使用自UTC(CoordinatedUniversal Time,國際協調時間)1970年1月1日午夜(零時)開始經過的毫秒數來儲存日期。在使

[c++] LPWSTRLPCSTRLPCWSTR淺析

LPCSTR是Win32和VC++所使用的一種字元串資料型別。LPCSTR被定義成是一個指向以'\0'結尾的常量字元的指標。 LPWSTR是wchar_t字串 LPCWSTR是一個指向unicode編碼字串的32位指標,所指向字串是wchar型,而不是char型。 LP

二十面向物件2— 隱藏屬性私有屬性私有方法__del__ 等四種如何使用測量物件的引用個數

一、隱藏屬性 在一個方法裡面去規範傳遞的屬性值。(更安全),為每一個屬性新增set   get 方法 二、私有屬性 1、在外部使用私有成員的名字時,會提示找不到。 2、例如self.__

18.dubbo引用配置快取執行緒棧自動dumpnetty4支援

dubbo 2.5.6版本新增了對netty4通訊模組的支援,啟用方式如下 provider端: <dubbo:protocol server="netty4" /> 或 <dubbo:provider server="netty4" /> consumer端: <dubbo

為什麼C++中常量引用可以繫結非常量的物件字面值和一般表示式 詳解

    在c++語言中,除兩種例外情況,其他引用的型別都要和與之繫結的物件嚴格匹配,如int型的引用只能繫結int型的物件;並且引用不能直接與字面值常量或表示式結果繫結。    其中一種例外情況是:初始化常量引用時,允許用任意表達式作為初始值,只要該表示式的結果能轉換成引用的

表單提交 防註入XSS 1入庫時轉義後臺 2出庫轉義前臺

his 驗證 替換字符 插入 如果 不同的 js代碼 urn ida 第一種 入庫過濾js自動填充時過濾js代碼class GoodsModel extends Model{ // 填充 protected $_auto = [ // 自己補充填充

oracle 12c 多租戶 pdb 恢復(單個pdb數據文件非系統pdb表空間整個pdb數據庫)

數據文件 ota ora-01110 創建 正常 方式 cti users rman 環境:數據庫版本 Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production實驗準備:1.--

Ztree _ 橫向顯示子節點點擊文字勾選去除指定元素input的勾選狀態

.cn hid ttr 很好 clas pre ges tree 效果 前些天項目需要樹結構表現數據,需求ztree就能滿足所以直接使用ztree只是踩了些小坑。。。 1.ztree子節點橫向顯示(下圖): 效果說明:第三級子節點按需求橫向顯示其他豎向顯示,每行最多顯示5

進擊的Python【第九章】:paramiko模塊線程與進程各種線程鎖queue隊列生產者消費者模型

password locking form maxsize 廁所 sorted [0 hostname nbsp 一、paramiko模塊 他是什麽東西?   paramiko模塊是用python語言寫的一個模塊,遵循SSH2協議,支持以加密和認證的方式,進行遠程服務器的連

[C++] 動態規劃之矩陣連乘最長公共子序列最大子段和最長單調遞增子序列

每次 種子 () return 避免 amp 可能 text com 一、動態規劃的基本思想   動態規劃算法通常用於求解具有某種最優性質的問題。在這類問題中,可能會有許多可行解。每一個解都對應於一個值,我們希望找到具有最優值的解。   將待求解問題分解成若幹個子問題,先求

Android----獲得當前應用包名當前activity的名字推斷是否是系統桌面service類

owin agen gac arr ddc add gets small cli 1、獲得當前應用包名 public static String getRunningActivityName(Context context) { ActivityManager acti

【Python】07python內置數據結構之字符串bytes

str 字符串 一、字符串1、定義和初始化In [4]: s = "hello python" In [4]: s = "hello python" In [5]: s Out[5]: ‘hello python‘ In [6]: s = ‘hello python‘ In [7]: s Out

struts2的返回類型struts的標簽庫struts2中完成國際化

let 頁面 const patch red struts2標簽 property 單選 bmi struts2的返回類型:在jsp-servlet中, 返回的類型主要有 轉發, 重定向; 轉發主要是RequestDispatcher的forward方法來進行操作的req.

bos 第3天(easyui彈窗邊界問題取派員的添加修改和批量刪除)

檔案 劃分 bug servle 手機號 rules function project rem BOS項目筆記 第3天 今天內容安排: 1、解決window窗口bug 2、bos項目整體需求分析(基礎設置、取派、中轉、路由、報表) 3、取派員添加功能 4、jQuery