0

基于这个对相关问题的回答,我尝试编写一个将标准字符串转换为宽字符串的方法,然后我可以将其转换为 wchar_t*。

为什么不是创建 wchar_t* 等价物的两种不同方式?(我已经展示了我的调试器给我的值)。

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()的指针(假设只是比较指针本身而不是所指向的内存块的内容)。

更新const wchar_t* wchar2 = GetWideString("me").c_str();不起作用,因为返回一个超出范围GetWideString()的临时变量,并在语句完成后立即释放。std::wstring因此,您正在获得一个指向临时内存块的指针,然后在该内存被释放时让该指针悬空,然后您才能将该指针用于任何事情。

另外,const wchar_t* wchar2 = GetWChar("me");不应该编译。GetWChar()返回 a std::wstring,它不实现到 的隐式转换wchar_t*。您必须使用该c_str()方法wchar_t*从 a 中获取 a std::wstring

于 2013-10-08T00:17:13.943 回答
1

因为两个指针不相等。Awchar_t *不是 a String,所以你得到通用的 AreEqual

于 2013-10-08T00:15:40.203 回答
0

std::wstring包含类型的宽字符wchar_tstd::string包含类型的字符char。对于存储在std::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 回答