1. 程式人生 > >常見編碼規範及其應用

常見編碼規範及其應用

適應 根據 編碼 ogr 方式 自己 mage 就是 char

概述

對於眾多的編碼規範一直沒有一個清晰的認識,本文旨在理清這些編碼規範的定義和特點。

ASCII

ASCII全稱是美國國家信息交換標準碼,它是用於字符轉換的一個標準,長度是7位,可以標記128個不同的字符,但是這個標準極其有限,比如說它就無法支持中文的編碼,甚至連其他英語國家的需求也無法滿足,比如說英國的英鎊符號。

ANSI

ANSI是美國的一家非營利制定國家標準的機構,ANSI也被稱為微軟的擴展字符集,8位表示,所以它也被稱為擴展ASCII,可以填充256個字符,這套標準最終成為ANSI/ISO 8859-1--1987。
各國根據這套標準弄出了自己的編碼表,比如著名的GB2312等,它們都統稱為ANSI編碼集,也叫MBCS(Multi-Byte Character System),這些編碼表都是8位,小於128的字符都跟ASCII編碼表一樣,大於128的字符後面會再跟著一個字節,稱作Leading byte,系統判斷它是否大於128,如果大於128,就知道它後面還有一個字節,通過這樣的編碼方式就可以將中文等語言編碼進去,但是這樣的編碼集太多了,在不同國家需要設定不同的編碼集,不利於程序的傳播,因此需求一個更加有效的統一標準解決這個問題,Unicode就應運而生了。

Unicode

Unicode是16位的,它可以表示的字符數是65535個,因此它涵蓋了幾乎所有的字符和象形文字,另外還可以包括一些符號等字符。Unicode占16位,因此它也叫UTF-16,後來為了在單字節的系統上順利使用,出現了UFT-8,它的編碼方式跟MBCS差不多。

ANSI C

即ANSI/ISO 9899-1990,它是美國國家標準機構為C語言專門制定的標準。

C語言和寬字符

ANSI C專門為C指定標準,它定義了一個寬字符的概念,使ANSI C標準支持多種用多個字節來表示一個字符的字符集。
C語言中的寬字符是基於wchar_t的。寬字符並不等於Unicode,Unicode只是寬字符的一種表現形式,不過在Windows程序中幫助理解,可以認為寬字符就是Unicode。

C語言寬字符版變量

wchar_t *p = L"Hello";

C語言寬字符版函數

在C語言當中,對於字符的操作函數幾乎都有兩個版本,比如printf(),對應寬字符版函數是wprintf(),這個函數在傳入字符串時需要在前面加上L""。

C語言自適應函數

如果有個需求:一份代碼編譯成ASCII和Unicode兩個版本,如果程序本身大量使用寬字符,可以想象,要編譯成ASCII版本,不僅要改編譯選項還要修改每個函數,每個字符串,這樣的工程量是巨大的,在VC++中,有一個TCHAR.H文件,它並不是ANSI C的一部分,但是它裏面的函數解決了這個問題,比如說使用它的_tcslen函數時,在寬字符下它就代表著wcslen,在多字節編碼下它就代表strlen,這就解決了函數的適配問題,使用 TEXT("xxx")時,在寬字符下它就代表L"xxx",在多字節下就代表"xxx",這就解決了變量的適配問題。

Windows SDK的字符類型

使用Windows SDK的程序推薦使用特定的類型用來替代C語言中的類型。
|c語言的類型|Windows類型|
|----|-----|
|wchar_t|WCHAR|
|char|CHAR|
|自適應|TCHAR
|...|...|
還有常見的如LPTSTR,L是指”long“的意思,P是指針。

Windows SDK的函數

Windows復制了一部分C運行庫函數,Windows的函數有很多,例如字符串處理函數,這些Windows函數都是寬字符和多字節自適應的:
技術分享圖片

常見編碼規範及其應用