1

ANSIをUnicodeに、またはその逆に変換するいくつかの関数があります。WideCharToMultiByteこれらの関数、、、、は次MultiByteToWideCharのとおりA2WですW2A

A2W今、私はどのようにそして働くのか理解していませんW2A重要なのは、何かを別のものに変換するときは、2つのセットAを設定して設定し、セットB内の各要素がセット内のA1つだけの要素にB一意にマップされるようにする必要があるということです。これに関していくつかの問題があります:

  1. ANSIは1バイトで、UNICODEは少なくとも2バイトです。これは、UNICODEセットのすべての要素をANSIに一意にマップできるわけではないことを意味します。

  2. セットANSIとセットUnicodeは厳密には定義されていません。つまり、両方に異なるエンコーディングがあります。

これにより、私の質問:どのようにそれらを変換し、データを台無しにしないことを確認できますか?

4

2 に答える 2

5

他の人が述べたように、「ANSI」などの文字セットはありません。残念ながら、Windows API はCP_ACP'ANSI コード ページ' を参照します。これは、マシンで選択されている非 Unicode ロケールに応じて、いくつかの文字セットの 1 つを参照します。

CP_ACPとはいえ、元の質問に関しては、いいえ、常にと と Unicode エンコーディングの間を往復できるわけではありません。CP_ACPたとえば、英語ロケールの Windows システムでは、「あ」に相当するものはありません。

これが発生すると、 は、設定されている場合、WideCharToMultiByte同等の文字を持たない文字を置き換え、 truelpDefaultCharに設定*lpUsedDefaultCharします。ブール変数へのポインターを渡し、lpUsedDefaultChar呼び出し後にチェックして、文字列に翻訳不可能な文字が含まれているかどうかを確認できます。MultiByteToWideCharただし、入力がローカルコードページで有効である限り、他の方向は失敗しません。無効なテキストを検出するには、MB_ERR_INVALID_CHARSフラグを渡してエラーをチェックします。ただし、テキストが他のコードページにあるからといって、エラーが発生するわけではありません (テキストが実際には無効であるか、単に意味不明である場合)。

于 2012-11-20T07:18:25.933 に答える
1

ラウンドトリップ変換を実行してから、結果を元の結果と比較します。

必要に応じて、変換関数を呼び出して、未定義の結果に対してエラーをスローすることができます。

于 2012-11-20T07:13:25.400 に答える