ここでリンゴをオレンジに変換しようとしています。MultiByteToWideCharとWideCharToMultiByteは、特定のエンコーディング、UTF-16<->ANSIを含む他のさまざまなエンコーディング間で変換します。
3つの問題:
- C標準ライブラリのchar<->wchar_t関数が動作するエンコーディングは、実装によって定義されます。これは、UCS-2とASCII、EBDIC、またはその他の任意の数のコードページの間で変換できます。wcstombsとmbstowcsが実際にUTF-16について話している、または実際にASCIIについて話していると想定できないため、windows関数をこれらに置き換えることはできません。通常、彼らが使用する実際のエンコーディングは、UNIXボックスのUTF-32です。
- UnixボックスはUTF-16を認識しないことがよくあります。ユニコードをサポートしている場合は、すべてUTF-8ベースです。
wchar_t
通常、UNIXボックスでは2バイトではなく4バイトであるため、すべてのコードをチェックして、コードのサイズが2バイトであると想定されていないことを確認する必要があります。
簡単に言えば、自分でエンコードを行うコードを書かない限り、これらの種類のものを処理する完全に移植可能な方法はありません。
移植性を持たせたい場合は、アプリケーションがWindowsでwchar_tを使用し、その他すべてでcharを使用するように、typedefなどを定義する必要があります。次に、UTF-16がWindowsボックスで使用されており、UTF-8がUNIXボックスで使用されていると想定する必要があります。
または:ICUなどのライブラリを使用する必要があります。