詳細な使用法とMultiByteToWideCharWideCharToMultiByte



Detailed Usage Multibytetowidechar Widechartomultibyte



説明リンク

注意:

これら2つの関数はWindowsが提供する変換関数であり、ユニバーサルではありません。



C言語関数は、提供されたmbstowcs()/ wcstombs()を変換します

まず、機能の簡単な紹介

ヘッダーファイルに関連:



関数ヘッダーの場所:windows.h

#include

wchar_tタイプの必須ヘッダーファイル:wchar.h

#include

(1)MultiByteToWideChar()



関数:この関数は、ワイド文字(Unicode)の文字列を文字列にマップします。関数によってマップされた文字列は、マルチバイト文字セットである必要はありません。

プロトタイプ:

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

パラメータ:

変換を実行するための文字セットはマルチバイト文字を使用します:1> CodePage

このパラメーターは、指定された値またはインストールされたシステムに有効な任意の文字セットにすることができます。次のいずれかに値を指定することもできます。

説明
CP_ACP ANSIコードページ
CP_MACCP サポートされていません
CP_OEMCP OEMコードページ
CP_SYMBOL サポートされていません
CP_THREAD_ACP サポートされていません
CP_UTF7 UTF-7コードページ
CP_UTF8 UTF-8コードページ

2> dwFlags:pre(存在する場合は組み合わせ)としてワイド文字に変換されるかどうか、代替制御文字を絵文字にするかどうか、および無効な文字を処理する方法を示すビットフラグのセット。次のマーカーの組み合わせは定数であり、次の意味を指定できます。

  • MB_PRECOMPOSED:多くの場合、プレ文字として使用されます。つまり、基本文字の文字と、単一の文字値のみのnull以外の文字です。これはデフォルトの変換オプションです。値をMB_COMPOSITEと組み合わせて使用​​することはできません。
  • MB_COMPOSITE:通常、文字の組み合わせ-つまり、基本文字とヌル文字以外の文字で構成されます。文字の文字値は異なります。値をMB_PRECOMPOSEDと組み合わせて使用​​することはできません。
  • MB_ERR_INVALID_CHARS:関数で無効な入力文字が検出された場合、関数は失敗し、ERROR_NO_UNICODE_TRANSLATIONGetLastErro値を返します。
  • MB_USEGLYPHCHARS:代替のコントロール象形文字を使用します。
    文字と文字ベースの非空白文字の組み合わせで構成され、各文字は異なる値を持ちます。事前に作成された各文字には、基本/非ヌル文字を形成するための単一の文字値があります。 È文字、eは基本文字、太字はnull以外の文字です。
    タグとMB_COMPOSITEMB_PRECOMPOSEDは相互に排他的であり、マークMB_USEGLYPHCHARS MB_ERR_INVALID_CHARSは、他のラベルの設定方法に関係なく使用できます。
    通常、これらのフラグは使用せず、値0を取ります。
    3> lpMultiByteStr:変換するバッファ文字列を指します。
    4> cchMultiByte:パラメーターlpMultiByteStr番号が指すバイト文字列を指定します。 -1に設定できます。指定された文字列の長さを自動的に決定します。lpMultiByteStr
    (ヌル文字列が中断されていない場合、-1に失敗する可能性があり、成功する可能性があります)、このパラメーターは0に設定され、関数は失敗します。
    5> lpWideCharStr:文字列変換ポイントはバッファを受け取ります。
    6> cchWideChar:パラメーターlpWideCharStrが指すバッファー内のバイト幅を指定します。値が0の場合、関数は変換を実行しませんが、ターゲットキャッシュlpWideChatStrの必要な文字数の幅を返します。
    戻り値:
    関数が成功し、cchWideCharが0でない場合、戻り値は、書き込まれたlpWideCharStrが指す幅の広いバッファーの文字数です。

関数が成功し、cchMultiByteが0の場合、戻り値は、バッファ要件のオペランドサイズによって変換されるワイド文字列です。 (これは、必要な変換数wchar_tを取得するために使用されます)

関数が失敗した場合、戻り値はゼロです。

拡張エラー情報を取得するには、GetLastError()関数を呼び出します。以下のエラーコードが返される場合があります。

ERROR_INSUFFICIENT_BUFFER; ERROR_INVALID_FLAGS;

ERROR_INVALID_PARAMETER; ERROR_NO_UNICODE_TRANSLATION。
(2)WideCharToMultiByte()
関数:この関数は、マルチバイトのUnicode文字列を文字列にマップします。

プロトタイプ:

int WideCharToMultiByte( UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cchMultiByte, LPCSTR lpDefaultChar, LPBOOL pfUsedDefaultChar )

パラメータ:

また、MultiByteToWideChar()関数は引数に似ていますが、3つ以上のパラメーターがあります。

lpDefaultCharおよびpfUsedDefaultChar: WideCharToMultiByte関数がワイド文字と、パラメーターuCodePageで識別され、その表現がない文字コードページを検出した場合にのみ、WideCharToMultiByte関数はこれら2つのパラメーターのみを使用します。 (通常、値はNULLです)

1>ワイド文字を変換できない場合は、文字lpDefaultCharパラメーターを使用する関数がポイントします。このパラメーターがNULL(ほとんどの場合パラメーター値)の場合、関数はデフォルトの文字システムを使用します。デフォルトの文字は通常疑問符です。疑問符はワイルドカードであるため、このファイル名は危険です。

2> pfUsedDefaultCharパラメーターはブール変数を指します。Unicode文字列に少なくとも1つの文字があり、同等のマルチバイト文字に変換できない場合、関数は変数をTRUEに設定します。すべての文字が正常に変換されると、変数の関数はFALSEに設定されます。関数が戻ってバイト幅の文字列が正常に変換されたかどうかを確認すると、変数をテストできます。

戻り値:

関数が成功し、cchMultiByteがゼロでない場合、戻り値は、書き込まれたlpMultiByteStrが指すバッファーのバイト数です。

関数が成功し、cchMultiByteがゼロの場合、戻り値は、必要なバッファに変換される文字列を受信したバイト数です。 (これは、目的の変換番号Charを取得するために使用されます)

関数が失敗した場合、戻り値はゼロです。

拡張エラー情報を取得するには、GetLastErrorを呼び出します。以下のエラーコードが返される場合があります。

ERROR_INSUFFICIENT_BJFFER;ERROR_INVALID_FLAGS; ERROR_INVALID_PARAMETER;ERROR_NO_UNICODE_TRANSLATION。

第二に、使用

(1)マルチバイト文字列からワイド文字列:

1)MultiByteToWideChar()関数を呼び出し、cchWideCharパラメーターを0に設定します(目的の変換を取得するためのバッファーサイズを受信します)

2)cchMultiByteの値として入力バッファーのサイズを取得します(これはスペースを節約するために行われ、cchMultiByte -1の値を指定できます(文字列はnullで終わる必要があります、そうでない場合はエラーが発生します))

3)変換後にUnicode文字列を格納するのに十分なメモリブロックを割り当てます

cchWideCharの先頭で決定されるメモリブロックのサイズ()関数の値を返します(他のメソッドを使用することもできますが、このメソッドはさらにメモリを節約します)

4)MultiByteToWideCharを再度呼び出す()関数、キャッシュされたアドレスをlpWideCharStrとして、パラメーターを渡し、最初の呼び出しを渡すMultiByteToWideChar()関数がcchWideCharパラメーター値として値を返す

文字列5)変換を使用

6)メモリブロックによって占有されている受信バッファを解放します

サンプルコード:

void main() { char sBuf[25]={0} strcpy(sBuf, 'I am the best') // get the input buffer size int sBufSize=strlen(sBuf) // Get the output buffer size // VC ++ default ANSI, so they chose the first argument is CP_ACP DWORD dBufSize=MultiByteToWideChar(CP_ACP, 0, sBuf, sBufSize, NULL, 0) printf('Need a wchar_t% u n', dBufSize) wchar_t * dBuf=new wchar_t[dBufSize] wmemset(dBuf, 0, dBufSize) // convert int nRet=MultiByteToWideChar(CP_ACP, 0, sBuf, sBufSize, dBuf, dBufSize) if(nRet<=0) { cout<<'Conversion failed.'<switch(dwErr) { case ERROR_INSUFFICIENT_BUFFER: printf('ERROR_INSUFFICIENT_BUFFER ') break case ERROR_INVALID_FLAGS: printf('ERROR_INVALID_FLAGS ') break case ERROR_INVALID_PARAMETER: printf('ERROR_INVALID_PARAMETER ') break case ERROR_NO_UNICODE_TRANSLATION: printf('ERROR_NO_UNICODE_TRANSLATION ') break } } else { cout<<'Convert Success'<cout<delete(dBuf) }

注:MultiCharToWideChar()を2回呼び出すと、パラメーター値はcchMultiByteと同じである必要があります。そうしないと、エラー不足の受信バッファークラスが発生し、変換が失敗する可能性があります。

(2)ワイドバイトバイト文字列をナローに

そしてステップ(1)同様に、それはここでは繰り返されません

コード例は次のとおりです。

// string narrow the wide string conversion wchar_t sBuf[25]={0} wcscpy(sBuf, L'I am the best') // obtain the required conversion of the target cache size DWORD dBufSize=WideCharToMultiByte(CP_OEMCP, 0, sBuf, -1, NULL,0,NULL, FALSE) // assign target cache char *dBuf = new char[dBufSize] memset(dBuf, 0, dBufSize) // Convert int nRet=WideCharToMultiByte(CP_OEMCP, 0, sBuf, -1, dBuf, dBufSize, NULL, FALSE) if(nRet<=0) { printf('Conversion failed n') } else { printf('Successful conversion nAfter Convert:% s n', dBuf) } delete []dBuf

3、MultiByteToWideChar()関数の文字化けした質問

一部の友人は、標準のWinCE4.2またはWinCE5.0 SDKエミュレーターで見つけた可能性があります。この関数は機能せず、すべての文字化けを変換した後の文字です。

タイムリーな変更MultiByteToWideChar()パラメーターは同じままです。しかし、これはコードの問題ではありません。重要なのは、カスタマイズされたオペレーティングシステムにあります。オペレーティングシステムをカスタマイズした場合、デフォルトの言語は中国語ではありません。

標準のSDKのデフォルト言語は英語であるため、問題が発生します。この問題の解決策ですが、システムをカスタマイズする場合は、コントロールパネルの[地域のオプション]と[デフォルトの言語]を簡単に変更して、デフォルトの言語を[中国語]に選択してください。デフォルトの言語位置をカスタマイズするシステムを選択します:プラットフォーム->設定...->ロケール->デフォルト言語、「中国語」を選択すると、コンパイラが実行できます。

Unicode:ワイド文字セット

  1. 文字数を取得するには、1バイト文字と2バイト文字の文字列の両方が含まれていますか?
    Microsoft Visual C ++ランタイムライブラリを呼び出すことができます。マルチバイトの_mbslen(シングルバイトのダブルバイトの両方を含む)文字列を操作する関数が含まれています。
    strlen関数を呼び出すと、文字列の量を実際に理解することはできません。0の終わりに達するまでのバイト数しかわかりません。
  2. DBCS(2バイト文字セット)文字列を操作する方法は?
    機能説明
    PTSTR CharNext(LPCTSTR)次の文字列のアドレスを返します
    PTSTR CharPrev(LPCTSTR、LPCTSTR)は、文字列のアドレスを返します
    BOOL IsDBCSLeadByte(BYTE)バイトが最初のバイトのDBCS文字である場合、ゼロ以外の値を返します
  3. なぜUnicodeを使用するのですか?

    異なる言語間でデータを簡単に交換できます。
    単一のバイナリ.exeファイルまたはDLLファイルをサポートするようにすべての言語を割り当てることができます。
    アプリケーションの効率を向上させます。
    Windows 2000は、Unicodeを使用してゼロから開発されています。Windows関数がANSI文字列を呼び出して渡す場合、システムはまずUnicodeに文字列を入力し、Unicode文字を使用してオペレーティングシステムに文字列を送信します。関数がANSI文字列を返すようにする場合、システムは最初にUnicode文字列をANSI文字列に変換し、次に結果をアプリケーションに返します。これらの文字列を変換するには、時間とメモリシステムを消費する必要があります。 Unicodeを使用してアプリケーションを最初から開発することにより、アプリケーションをより効率的に実行できます。
    Windows CEはUnicode自体をオペレーティングシステムとして使用し、ANSIWindows関数をサポートしていません
    Windows 98はANSIのみをサポートし、ANSIへのアプリケーションを開発できます。
    MicrosoftCOMは16ビットのWindowsWin32に変換され、すべてのCOMインターフェイスメソッドに必要と決定された文字列はUnicode文字列のみを受け入れることができます。

  4. Unicodeソースコードの書き方は?
    Unicode用に設計されたMicrosoftCorporation WindowsAPI。これにより、コードの影響を最小限に抑えることができます。実際、単一のソースコードファイルは、コンパイルするUnicodeを使用して、または使用せずに書き込むことができます。 2つのマクロ(UNICODEと_UNICODE)を定義するだけで、ソースファイルを変更して再コンパイルできます。
    _UNICODEは、Cヘッダーファイルのマクロを実行し、WindowsヘッダーファイルのマクロUNICODEを実行します。ソースコードモジュールをコンパイルするときは、通常2つのマクロを定義する必要があります。

  5. Windows Unicodeで定義されたデータ型はありますか?
    説明データ型
    WCHARUnicode文字
    PWSTRUnicode文字列ポインタポイント
    文字列定数Unicodeへのポインタを指すPCWSTR
    データ型CHAR、LPSTR、およびLPCSTRに対応するANSI。
    ANSI / Unicodeは、ユニバーサルデータ型TCHAR、PTSTR、LPCTSTRです。

  6. Unicodeの操作方法は?
    文字の特徴的な例
    strstrcpyを開始するANSI操作関数
    wcswcscpyで始まるUnicode操作関数
    MBCS操作関数は_mbs_mbscpyを開始します
    _tcscpy(Cランタイムライブラリ)を開始するためのANSI / Unicode_tcs操作関数
    lstrcpyを開始するANSI / Unicode lstr演算関数(Windows関数)
    は廃止されておらず、すべての新しい関数には、Windows2000でANSIとUnicodeの2つのバージョンがあります。終了関数はANSIバージョンで説明されていますWで表される関数のUnicodeバージョンの終了。Windowsは次のように定義されます。

#ifdef UNICODE #define CreateWindowEx CreateWindowExW #else #define CreateWindowEx CreateWindowExA #endif // !UNICODE

7.内容を一覧表示します
Unicode文字列定数の方法を示しますか?
文字例
ANSI「文字列」
UnicodeL「文字列」
ANSI / Unicode T( '文字列')または_TEXT( '文字列')if(szError [0] == _TEXT( 'J')){}
7.オペレーティングシステム機能をいつでも使用する必要があるのはなぜですか?
これは、オペレーティングシステムがオペレーティングシステムのシェルプロセスExplorer.exeなどの大規模なアプリケーションでよく使用されるため、アプリケーションのパフォーマンスをわずかに向上させるのに役立ちます。これらの関数は多くを使用し、したがってアプリケーションが実行されているため、RAMにロードされている可能性があります。
例:StrCat、StrChr、StrCmpStrCpyなど。
8. ANSIおよびUnicodeに準拠するアプリケーションを作成するにはどうすればよいですか?
(1)文字配列としてのテキスト文字列、またはバイト配列ではなく文字の配列。
(2)一般的なデータ型(TCHARやPTSTRなど)とテキスト文字の文字列。
(3)明示的なデータ型(BYTEやPBYTEなど)、バイト、バイトポインター、およびデータキャッシュ。
(4)TEXTマクロおよび文字列リテラルの場合。
(5)グローバル置換を実行します(例:PSTRをPTSTRに置き換えます)。
(6)文字列操作の問題を修正します。たとえば、伝達関数は一般に、バイトではなくキャッシュの文字サイズで望ましいものです。つまり、sizeof(szBuffer)を渡してはならず、(sizeof(szBuffer)/ sizeof(TCHAR)を渡してください。さらに、メモリのブロックを文字列に割り当てる必要があり、文字数が文字列を作成し、ライブYaoanバイトをメモしてメモリを割り当てます。つまり、malloc(nCharacters)を呼び出す代わりに、malloc(nCharacters * sizeof(TCHAR))を呼び出す必要があります。
9.コンテンツリスト
文字列の比較はどのくらい選択的ですか?
CompareStringを呼び出すことによって実現されます。
フラグの意味
NORM_IGNORECASEは大文字の大文字小文字を無視します
NORM_IGNOREKANATYPEひらがなとカタカナの文字は区別されません
NORM_IGNORENONSPACE間隔無視文字なし
NORM_IGNORESYMBOLS記号は無視されます
NORM_IGNOREWIDTHは、1バイト文字と2バイト文字を区別しません。
SORT_STRINGSORT句読点は通常の記号として扱われます
10 ..テキストファイルまたはANSIがUnicodeであるかどうかを判断する方法は?
2バイトが0xFFと0xFEの場合はテキストファイルの先頭で決定され、それ以外の場合はUnicodeであり、それ以外の場合はANSIです。
11. UnicodeまたはANSIが文字列であるかどうかを確認する方法は?
判断のためにIsTextUnicode。キャッシュの内容を推測するために一連の統計的手法と定性的手法を使用するIsTextUnicode。このメソッドは正確な科学ではないため、IsTextUnicodeが誤った結果を返す可能性があります。
12. Unicode文字列とANSIの間で変換する方法は?
マルチバイト幅の文字列を文字列に変換するためのWindowsMultiByteToWideChar関数WideCharToMultiByte関数は、幅の広い文字列に相当するマルチバイト文字列を変換します。