Windows 程序設計3:寬窄字節的區別及重要性

文章目錄

  • 前言
  • 一、寬窄字節簡介
  • 二、操作系統及VS編譯器對寬窄字節的編碼支持
    • 1. 操作系統
    • 2. 編譯器
  • 三、寬窄字符串的優缺點
  • 四、寬窄字節數據類型
  • 總結


前言

Windows 程序設計3:寬窄字節的區別及重要性。


一、寬窄字節簡介

在C++中,常用的字符串指針就是char* ,字符串變量為string,內部也是對char* 的封裝,但是并不了解這些跟寬窄字節有什么關系。

實際上,最早的系統都是窄字節的,也就是我們最常用的char,因為都是英文的一共就26個字母,再加上其他的一些符號標點,char就足夠用了。無符號的char最多可以表示255個字符,已經足夠。

后來隨著操作系統的國際化,系統出現了很多語言版本。原來的char表示一個英文字符的方式已經無法表達一個中文漢字了。漢字有好幾萬個,單純的char取值范圍已經不夠了。此時有人想到,一個char表示不下那就用兩個char來表示一個漢字。因此,數字、字母等仍用窄字節,也就是一個char來表示;一個漢字或全角字符等使用兩個char來表示。

雖然這樣可以基本解決問題,即在中文系統上能正常顯示中文、在其他語言系統上也能夠正常顯示,但是如果想把一個在中文系統上寫的軟件拿到日文或韓文等其他語言的系統上就會出現亂碼,漢字是無法正常顯示的。同理,其他語言的軟件拿到中文系統上也會出現亂碼。

那么為了解決這樣國際化的問題,微軟在Windows系統中引入了寬字節的功能,即Unicode。Unicode中規定任意一個字符都占用兩個字節,即兩個char。無論是字符還是字母、數字、漢字都占用兩個字節。用兩個char難免造成不方便,因此微軟定義了一個新的類型:wchar_t,其原型實際上就是unsigner short,占用兩個字節。

二、操作系統及VS編譯器對寬窄字節的編碼支持

1. 操作系統

Windows提供了兩種類型的API函數,如MessageBox函數,實際上MessageBox函數只是一個宏,其對應了兩個版本的函數:MessageBoxA和MessageBoxW,在VS編譯器中使用時系統會根據是否定義了_UNICODE宏來進行判斷當前工程使用寬字節的Unicode編碼還是窄字節編碼,以此來決定使用哪個版本的函數。如果沒有定義,則使用窄字節的MessageBoxA;如果定義了就使用寬字節的MessageBoxW。
右鍵MessageBox,點擊轉到定義
在這里插入圖片描述
可以看到該宏的具體定義
在這里插入圖片描述
可以利用Depends工具查看動態鏈接庫中的函數,見https://blog.csdn.net/qq_59940419/article/details/144721964?spm=1001.2014.3001.5502,MessageBox在User32.dll中,打開如下路徑:C:\Windows\System32,找到User32.dll將其拖入到Depends工具中,可以找到兩個函數。
在這里插入圖片描述
其他的很多函數也都是這樣進行區分寬窄字節的。大家可以自己看一看。

說明:Windows 2000以后的系統都是使用Unicode從頭進行開發的,如果調用任何一個Windows API函數并傳遞一個ANSI即窄字節的字符串,那么系統會首先將字符串轉換為Unicode,然后將Unicode即寬字節的字符串傳遞給操作系統。如果希望函數返回ANSI字符串,系統就會先將Unicode字符串轉換為ANSI字符串,然后將結果返回給應用程序。進行這些字符串的轉換需要占用系統的時間和內存,通過從頭開始使用Unicode來開發應用程序,可以使得應用程序運行得更加高效。因此開發時建議使用寬字節。

2. 編譯器

VC++6.0默認為窄字節編碼。vs2005, vs2008, vs2010, vs2012, vs2013, vs2015, vs2017等等都是默認Unicode編碼。也可以在工程中設置編碼方式。
右鍵項目,點擊屬性
在這里插入圖片描述
可以在字符集處調整編碼方式
在這里插入圖片描述
注意:從vs2013開始,如果要將工程默認的Unicode編碼轉為窄字節編碼,需要安裝多字節補丁。

三、寬窄字符串的優缺點

即便Unicode寬字節相對來說更好,但是其也有缺點。

一般來說,設計界面和跟字符串操作相關的,推薦使用寬字節。其他地方還是可以使用窄字節的,因為寬字節的占用空間是窄字節的二倍。這樣的話在本機還好,如果涉及字符串的網絡傳輸,那么傳輸量會偏大。所以也不是說什么時候都要使用Unicode寬字節。

在一個工程中,有的地方使用寬字節,有的地方使用窄字節(如一些代碼邏輯和網絡傳輸使用窄字節,界面設計使用寬字節),這就需要進行寬窄字節的轉換。微軟提供相應的API函數,直接使用即可。

四、寬窄字節數據類型

大家熟知的char, char* 都是窄字節的。常見的一些數據類型如下:
窄字節:
char, char* , const char*
CHAR, (PCHAR, PSTR, LPSTR), LPCSTR

Unicode寬字節:
wchar_t, wchar_t* , const wchar_t*
WCHAR, (PWCHAR, PWSTR, LPWSTR), LPCWSTR

_T通用類型:
TCHAR, (TCHAR* , PTCHAR, PTSTR, LPTSTR), LPCTSTR

其中,P代表指針的思想,STR表示字符串的意思,L是長指針的意思(在Win32平臺下可以忽略),C表示const常量的意思,W表示wide寬字節的意思,T可以理解為通用類型的意思。

可以根據工程中是否定義_UNICODE宏,來判斷當前工程的編碼是寬字節還是窄字節,然后再定義成不同的類型。比如TCHAR類型,如果工程中定義了_UNICODE宏,那么就表明工程是寬字節編碼的,其最終就被定義為wchar_t類型,如果工程中沒有定義_UNICODE宏,就表明工程是窄字節編碼的,其最終被定義為char類型。通用類型的優勢在于,在修改了工程的編碼格式之后不需要修改代碼,因此更加建議使用通用類型。


總結

Windows 程序設計3:寬窄字節的區別及重要性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/65799.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65799.shtml
英文地址,請注明出處:http://en.pswp.cn/web/65799.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

進階——十六屆藍橋杯嵌入式熟練度練習(LED的全開,全閉,點亮指定燈,交替閃爍,PWM控制LED呼吸燈)

點亮燈的函數 void led_show(unsigned char upled) { HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOC,upled<<8,GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RE…

力扣 最大子數組和

動態規劃&#xff0c;前綴和&#xff0c;維護狀態更新。 題目 從題可以看出&#xff0c;找的是最大和的連續子數組&#xff0c;即一個數組中的其中一個連續部分。從前往后遍歷&#xff0c;每遍歷到一個數可以嘗試做疊加&#xff0c;注意是嘗試&#xff0c;因為有可能會遇到一個…

Homestyler 和 Tripo AI 如何利用人工智能驅動的 3D 建模改變定制室內設計

讓設計夢想照進現實 在Homestyler,我們致力于為每一個夢想設計師提供靈感的源泉,而非挫折。無論是初學者打造第一套公寓,或是專業設計師展示作品集,我們的直觀工具都能讓您輕松以驚人的3D形式呈現空間。 挑戰:實現定制設計的新紀元 我們知道,將個人物品如傳家寶椅子、…

如何當前正在運行的 Elasticsearch 集群信息

要查看當前正在運行的 Elasticsearch 集群信息&#xff0c;可以通過以下幾種方法&#xff1a; 1. 使用 _cluster/health API _cluster/health API 返回集群的健康狀態、節點數量、分片狀態等信息。可以用 curl 命令直接訪問&#xff1a; curl -X GET "http://localhost…

算法練習4——一個六位數

這道題特別妙 大家仔細做一做 我這里采用的是動態規劃來解這道題 結合題目要求找出數與數之間的規律 抽象出狀態轉移方程 題目描述 有一個六位數&#xff0c;其個位數字 7 &#xff0c;現將個位數字移至首位&#xff08;十萬位&#xff09;&#xff0c;而其余各位數字順序不…

client-go 的 QPS 和 Burst 限速

1. 什么是 QPS 和 Burst &#xff1f; 在 kubernetes client-go 中&#xff0c;QPS 和 Burst 是用于控制客戶端與 Kubernetes API 交互速率的兩個關鍵參數&#xff1a; QPS (Queries Per Second) 定義&#xff1a;表示每秒允許發送的請求數量&#xff0c;即限速器的平滑速率…

B-tree 數據結構詳解

1. 引言 1.1 什么是 B-tree&#xff1f; B-tree&#xff08;Balanced Tree&#xff0c;平衡樹&#xff09;是一種自平衡的多路搜索樹數據結構&#xff0c;其核心特性包括&#xff1a; 多路性&#xff1a; 每個節點可以包含多個關鍵字和子節點&#xff0c;而非僅二分。平衡性…

Python 正則表達式完全指南

# Python 正則表達式完全指南 正則表達式&#xff08;Regular Expression&#xff09;是Python中進行文本處理的強大工具。本指南將詳細介紹Python中正則表達式的使用方法和實踐技巧。 ## 1. 基礎知識 ### 1.1 導入正則表達式模塊 python import re ### 1.2 創建正則表達式 在…

Vue的scoped原理是什么

CSS常見模塊化方案 BEM&#xff08;Block Element Modifier&#xff09;: BEM是一種流行的命名約定&#xff0c;它通過特定的命名規則來組織CSS類名&#xff0c;使得樣式具有模塊化、可重用性和可讀性。BEM的命名規則是&#xff1a;block__element--modifier。 block&#xf…

【LC】3270. 求出數字答案

題目描述&#xff1a; 給你三個 正 整數 num1 &#xff0c;num2 和 num3 。 數字 num1 &#xff0c;num2 和 num3 的數字答案 key 是一個四位數&#xff0c;定義如下&#xff1a; 一開始&#xff0c;如果有數字 少于 四位數&#xff0c;給它補 前導 0 。答案 key 的第 i 個數…

太原理工大學軟件設計與體系結構 --javaEE

這個是簡答題的內容 選擇題的一些老師會給你們題庫&#xff0c;一些注意的點我會做出文檔在這個網址 項目目錄預覽 - TYUT復習資料:復習資料 - GitCode 希望大家可以給我一些打賞 什么是Spring的IOC和DI IOC 是一種設計思想&#xff0c;它將對象的創建和對象之間的依賴關系…

深度學習知識點:LSTM

文章目錄 1.應用現狀2.發展歷史3.基本結構4.LSTM和RNN的差異 1.應用現狀 長短期記憶神經網絡&#xff08;LSTM&#xff09;是一種特殊的循環神經網絡(RNN)。原始的RNN在訓練中&#xff0c;隨著訓練時間的加長以及網絡層數的增多&#xff0c;很容易出現梯度爆炸或者梯度消失的問…

mmdet

一&#xff0c;configs/_base_ 1.default_runtime.py 2.schedule_1x.py 二&#xff0c;mmdet 1.datasets/coco.py/CocoDataset METAINFO {classes:(milk, red, spring, fanta, sprite, pepsi, king, ice, cola, scream ),# palette is a list of color tuples, which is us…

ElasticSearch 認識和安裝ES

文章目錄 一、為什么學ElasticSearch?1.ElasticSearch 簡介2.ElasticSearch 與傳統數據庫的對比3.ElasticSearch 應用場景4.ElasticSearch 技術特點5.ElasticSearch 市場表現6.ElasticSearch 的發展 二、認識和安裝ES1.認識 Elasticsearch&#xff08;簡稱 ES&#xff09;2.El…

node.js中實現token的生成與驗證

Token&#xff08;令牌&#xff09;是一種用于在客戶端和服務器之間安全傳輸信息的加密字符串。在Web開發中&#xff0c;Token常用于身份驗證和授權&#xff0c;確保用戶能夠安全地訪問受保護的資源。 作用與意義 身份驗證&#xff1a;Token可以用來驗證用戶的身份&#xff0…

第34天:安全開發-JavaEE應用反射機制攻擊鏈類對象成員變量方法構造方法

時間軸&#xff1a; Java反射相關類圖解&#xff1a; 反射&#xff1a; 1、什么是 Java 反射 參考&#xff1a; https://xz.aliyun.com/t/9117 Java 提供了一套反射 API &#xff0c;該 API 由 Class 類與 java.lang.reflect 類庫組成。 該類庫包含了 Field 、 Me…

Django后端相應類設計

通用的ApiResponse類&#xff1a;用于生成統一的 API 響應格式。每個響應都包含以下字段&#xff08;每個接口最終的返回數據格式&#xff09;&#xff1a; status_code&#xff1a;HTTP 狀態碼&#xff08;如 200、400、500 等&#xff09;message&#xff1a;響應的描述信息…

汽車基礎軟件AutoSAR自學攻略(三)-AutoSAR CP分層架構(2)

汽車基礎軟件AutoSAR自學攻略(三)-AutoSAR CP分層架構(2) 下面我們繼續來介紹AutoSAR CP分層架構&#xff0c;下面的文字和圖來自AutoSAR官網目前最新的標準R24-11的分層架構手冊。該手冊詳細講解了AutoSAR分層架構的設計&#xff0c;下面讓我們來一起學習一下。 Introductio…

css面試常考布局(圣杯布局、雙飛翼布局、三欄布局、兩欄布局、三角形)

兩欄布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> &…

模糊查詢在sqlserver、dm8、mysql的編寫示例

模糊查詢要求&#xff1a;字段值以 25D 開頭&#xff0c;并以 4 位數字結尾 sqlserver&#xff1a; select * from table_name where column_name like 25D[0-9][0-9][0-9][0-9] 說明&#xff1a; 25D&#xff1a;表示字符串以 25D 開頭。 [0-9][0-9][0-9][0-9]&#xf…