日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

API – MultiByteToWideChar的用法

發布時間:2025/3/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 API – MultiByteToWideChar的用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

技術交流,DH講解.

在D2010中多了一個類TEncoding,這個類用來轉換不同編碼的字符串.
在看這個類的代碼的時候我看見這個API函數,具體來說這個函數將一個字節數組轉換PWideChar.
因為不同編碼下一個字符串占的字節數是不一樣的,這樣轉換后每個字符都只占2個字節了,這樣可以統一一下.
看下這個函數在MSDN中的聲明:

int MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte, LPWSTR lpWideCharStr, int cchWideChar );

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,那么返回值就是字符的個數.
現在有了字符個數了,我們看怎么把字節數組轉成相應的字符數組:

function TMBCSEncoding.GetChars(Bytes: PByte; ByteCount: Integer; Chars: PChar;CharCount: Integer): Integer; begin {$IF DEFINED(UNICODE)}Result := MultiByteToWideChar(FCodePage, FMBToWCharFlags,PAnsiChar(Bytes), ByteCount, PChar(Chars), CharCount); {$ELSE}Result := CharCount;Move(Bytes^, Chars^, CharCount * SizeOf(AnsiChar)); {$IFEND} end;

與之相反的函數就是WideCharToMultiByte.

上面的例子都是來自VCL中的代碼.

好了,就說這個API.我是DH.

總結

以上是生活随笔為你收集整理的API – MultiByteToWideChar的用法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。