API – MultiByteToWideChar的用法
技術交流,DH講解.
在D2010中多了一個類TEncoding,這個類用來轉換不同編碼的字符串.
在看這個類的代碼的時候我看見這個API函數,具體來說這個函數將一個字節數組轉換PWideChar.
因為不同編碼下一個字符串占的字節數是不一樣的,這樣轉換后每個字符都只占2個字節了,這樣可以統一一下.
看下這個函數在MSDN中的聲明:
Delphi中聲明:
function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD;const lpMultiByteStr: LPCSTR; cchMultiByte: Integer;lpWideCharStr: LPWSTR; cchWideChar: Integer): Integer; stdcall;我們看看參數的作用:
CodePage:指定執行轉換的代碼頁,這個參數可以為系統已安裝或有效的任何代碼頁所給定的值。具體編碼的CodePage可以查MSDN.
dwFlags:一組位標記用以指出是否未轉換成預作或寬字符(若組合形式存在),是否使用象形文字替代控制字符,以及如何處理無效字符。你可以指定下面是標記常量的組合,含義如下:
MB_PRECOMPOSED:通常使用預作字符——就是說,由一個基本字符和一個非空字符組成的字符只有一個單一的字符值。這是缺省的轉換選擇。不能與
MB_COMPOSITE值一起使用。
MB_COMPOSITE:通常使用組合字符——就是說,由一個基本字符和一個非空字符組成的字符分別有不同的字符值。這是缺省的轉換選擇。不能與MB_PRECOMPOSED值一起使用。
MB_ERR_INVALID_CHARS:如果函數遇到無效的輸入字符,它將運行失敗,且GetLastErro返回ERROR_NO_UNICODE_TRANSLATION值。
MB_USEGLYPHCHARS:使用象形文字替代控制字符。
組合字符由一個基礎字符和一個非空字符構成,每一個都有不同的字符值。每個預作字符都有單一的字符值給基礎/非空字符的組成。在字符è中,e就是基礎字符,而重音符標記就是非空字符。
函數的缺省動作是轉換成預作的形式。如果預作的形式不存在,函數將嘗試轉換成組合形式。
標記MB_PRECOMPOSED和MB_COMPOSITE是互斥的,而標記MB_USEGLYPHCHARS和MB_ERR_INVALID_CHARS則不管其它標記如何都可以設置。
lpMultiByteStr:指向將被轉換字符串的字符。
cchMultiByte:指定由參數lpMultiByteStr指向的字符串中字節的個數。如果這個值為C1,字符串將被設定為以NULL為結束符的字符串,并且自動計算長度。
lpWideCharStr:指向接收被轉換字符串的緩沖區。
cchWideChar:指定由參數lpWideCharStr指向的緩沖區的字節個數。若此值為零,函數返回緩沖區所必需的寬字符數,在這種情況下,lpWideCharStr中的緩沖區不被使用。
返回值:如果函數運行成功,并且cchWideChar不為零,返回值是由 lpWideCharStr指向的緩沖區中寫入的寬字符數;如果函數運行成功,并且cchMultiByte為零,返回值是接收到待轉換字符串的緩沖區所需求的寬字符數大小。
有了上面的介紹,我們來看一下怎么確定一個多字節數組中有多少個字符呢?
function TUTF7Encoding.GetCharCount(Bytes: PByte; ByteCount: Integer): Integer; begin {$IF DEFINED(UNICODE)}Result := inherited GetCharCount(Bytes, ByteCount); {$ELSE}Result := MultiByteToWideChar(FCodePage, FWCharToMBFlags,PAnsiChar(Bytes), ByteCount, nil, 0); {$IFEND} end;如上面所說,只需要把第五個參數設置成nil,第六個參數為0,那么返回值就是字符的個數.
現在有了字符個數了,我們看怎么把字節數組轉成相應的字符數組:
與之相反的函數就是WideCharToMultiByte.
上面的例子都是來自VCL中的代碼.
好了,就說這個API.我是DH.
總結
以上是生活随笔為你收集整理的API – MultiByteToWideChar的用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: perl学习笔记(8)
- 下一篇: shell检查硬盘分区空间