0

関連する質問に対するこの回答に基づいて、標準文字列をワイド文字列に変換するメソッドを作成しようとしました。これを wchar_t* に変換できます。

wchar_t* と同等のものを作成する 2 つの異なる方法がないのはなぜですか? (デバッガーが提供する値を示しました)。

TEST_METHOD(TestingAssertsWithGetWideString)
{
   std::wstring wString1 = GetWideString("me");
   const wchar_t* wchar1 = wString1.c_str(); // wchar1 = "me"
   const wchar_t* wchar2 = GetWideString("me").c_str(); // wchar2 = "ﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮ@" (Why?!)
}

ここで、GetWideString は次のように定義されています。

inline const std::wstring GetWideString(const std::string &str)
{
   std::wstring wstr;
   wstr.assign(str.begin(), str.end());

   return wstr;
};

注:以下も機能しません。

const wchar_t* wchar2 = GetWChar("me");

const wchar_t *GetWChar(const std::string &str)
{
   std::wstring wstr;
   wstr.assign(str.begin(), str.end());

   return wstr.c_str();
};
4

3 に答える 3

2

を呼び出すたびに、新しく割り当てられたメモリ バッファを持つGetWideString()新しい が作成されます。std::wstring異なるメモリ ブロックへのポインターを比較しています (ポイントされているメモリ ブロックの内容Assert::AreEqual()ではなく、単にポインター自体を比較していると仮定します)。

Update :ステートメントが終了するとすぐに範囲外になり、解放される一時を返すconst wchar_t* wchar2 = GetWideString("me").c_str();ため、機能しません。したがって、一時メモリ ブロックへのポインタを取得し、ポインタを何かに使用する前にそのメモリが解放されたときに、そのポインタをぶら下げたままにします。GetWideString()std::wstring

また、const wchar_t* wchar2 = GetWChar("me");コンパイルしないでください。への暗黙的な変換を実装していない をGetWChar()返します。からを取得するには、 メソッドを使用する必要があります。std::wstringwchar_t*c_str()wchar_t*std::wstring

于 2013-10-08T00:17:13.943 に答える
1

2 つのポインターが等しくないためです。Awchar_t *は ではないため、一般的な AreEqualStringを取得します。

于 2013-10-08T00:15:40.203 に答える
0

std::wstringタイプのワイド文字が含まれていますwchar_tstd::stringタイプの文字が含まれていますcharstd::stringマルチバイトエンコーディング内に格納された特殊文字が使用されています。つまり、一部の文字は、そのような文字列内の 2 文字で表されます。したがって、これらの間の変換は、単純な を呼び出すほど簡単ではありませんassign

「ワイド」文字列とマルチバイト文字列の間で変換するには、次のヘルパーを使用できます (Windows のみ)。

// multi byte to wide char:
std::wstring s2ws(const std::string& str)
{
    int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0);
    std::wstring wstrTo(size_needed, 0);
    MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed);
    return wstrTo;
}

// wide char to multi byte:
std::string ws2s(const std::wstring& wstr)
{
    int size_needed = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), int(wstr.length() + 1), 0, 0, 0, 0); 
    std::string strTo(size_needed, 0);
    WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), int(wstr.length() + 1), &strTo[0], size_needed, 0, 0); 
    return strTo;
}
于 2013-10-08T00:22:14.483 に答える