2016-11-18 4 views
1

私はユニコード文字で塗りつぶすCMapStringToStringを持っています。 CMapStringToStringはUnicodeを処理できませんか?

m_oMap.SetAt(CString(bstrID), CString(bstrText)); 

bstrText

は、実際に正しく格納されたUnicode文字(キリル文字記号、日本語の記号、等)を含むBSTRです。この時点で、 bstrTextは、例えば、 "Калибровка"。

私はシンボルを取得しようとする場合は、Unicodeのエンコーディングが失われているようだ。例えば、このラインrValue

BOOL b = m_oMap.Lookup((LPCTSTR)key, rValue); // key and value are CString& 

"??????????" "Калибровка"の代わりに。

ここで何が起こっているか

+1

ユニコードの設定は何ですか? – nvoigt

+0

私のプロジェクトはすべてUnicode文字セットを使用するように設定されています。 – Exa

+0

あなたは[mcve]を投稿できますか? – nvoigt

答えて

1

私はVS2015でシンプルなMFCダイアログベースのアプリケーションを作成しました、あなたのUnicode文字列を含む文字列リソースIDS_TEST_UNICODEを追加し、次のMFCコードは正常に動作します:

void CTestMfcApp1Dlg::OnBnClickedButtonTest1() 
{ 
    CMapStringToString m; 

    CString value(MAKEINTRESOURCE(IDS_TEST_UNICODE)); 
    m.SetAt(CString(L"MyKey"), value); 

    CString readValue; 
    VERIFY(m.Lookup(L"MyKey", readValue)); 
    VERIFY(readValue == value); 
} 

あなたはスクリーンショットから注意してくださいすることができますよう一番下に

CMapStringToStringはあなたのケースでもうまく動作し、その代わりにのマップから取得された値の文字列の内容を視覚化するだけで問題が発生している可能性がありますか?

Screenshot

+0

'CString値((LPCTSTR)IDS_TEST_UNICODE);)では、代わりに[MAKEINTRESOURCEマクロ](https://msdn.microsoft.com/en-us/library/windows/desktop/ms648029.aspx)を使用する必要があります。 [CString](https://msdn.microsoft.com/en-us/library/5bzxfsea.aspx)ドキュメントでは、同じキャストを使用していますが、これを繰り返す理由はありません)。また、 '_CSTRING_DISABLE_NARROW_WIDE_CONVERSION'を定義して、不注意なUnicode↔ANSI変換を無効にすることもできます。 – IInspectable

+0

追加情報ありがとうございました。私はこれを解決策として受け入れ、私のソリューションにはまだUnicodeをサポートするように変更されていない参照プロジェクトがあることを指摘します。 – Exa

関連する問題