Windows 向けに開発していて、一部の WinAPI 関数で LPWSTR を文字列データ型として使用する必要がある場合。ライブラリで C++11 の u16string を使用しても問題ありませんか? これらの 2 つのデータ型は同じものですか?
LPWSTR は wchar_t のように見えますが、もう誰も wchar_t を好きではありません...
C++11char16_t
タイプは。とは異なりwchar_t
ます。理論的には、とWindows' (Windows'は16ビット)のreinterpret_cast
間を行き来することができます。ただし、実際には、Visual C ++ 10.0(およびVisual C ++ 11.0も)は、またはのようなUnicodeリテラルのサポートを欠いています。char16_t*
wchar_t*
wchar_t
u'A'
u"A"
要約すると(SOでは、すべての結論を明確にする必要があることがわかりました):
「ライブラリでC++11のu16stringを使用しても大丈夫ですか?」
確かに、しかし文字列の直接のプラグイン置換としてではなくwchar_t
、2012年の時点で、Visual C ++のサポートを計画している場合は、現在問題があります(リテラルのサポートがないため)。
「これらの2つのデータ型は同じものですか?」
いいえ。
「もう誰もwchar_tが好きではありません...」
それは確かにそうではありません。
wchar_t
とchar16_t
は異なる型であるため、 (未定義の動作を引き起こすa なしで)u16string.c_str()
として使用することはできません。LPWSTR
reinterpret_cast
wchar_t
プラットフォームで UTF-16 としてエンコードされていることが確実な場合は、データを次の場所にコピーできます。
std::wstring my_wstring(my_u16string.begin(), my_u16string.end());
my_wstring.c_str()
LPWSTR として使用します。関数呼び出しでは、一時的に使用できます。
SomeWindowsAPI(std::wstring(my_u16string.begin(), my_u16string.end()).c_str());
wchar_t
Windows では 16 ビットであり、LPWSTR
値は UTF-16 でエンコードされているため、API と対話するときに値を使用できますが、コンパイラを満足させるために型キャストする必要がありますchar16_t
。u16string