Alo*_*ave 34
TCHAR
只是一个typedef,根据您的编译配置,默认为char
或wchar
.
标准模板库支持ASCII(带std::string
)和宽字符集(带std::wstring
).您需要做的就是将typedef String作为std :: string或std :: wstring,具体取决于您的编译配置.为了保持灵活性,您可以使用以下代码:
#ifndef UNICODE
typedef std::string String;
#else
typedef std::wstring String;
#endif
Run Code Online (Sandbox Code Playgroud)
现在,您可以String
在代码中使用并让编译器处理令人讨厌的部分.字符串现在将具有允许您转换TCHAR
为std::string
或的构造函数std::wstring
.
TCHAR类型是char
或wchar_t
,取决于您的项目设置.
#ifdef UNICODE
// TCHAR type is wchar_t
#else
// TCHAR type is char
#endif
Run Code Online (Sandbox Code Playgroud)
因此,如果必须使用std::string
而不是std::wstring
,则应使用转换器功能.我可以用wcstombs
或WideCharToMultiByte
.
TCHAR * text;
#ifdef UNICODE
/*/
// Simple C
const size_t size = ( wcslen(text) + 1 ) * sizeof(wchar_t);
wcstombs(&buffer[0], text, size);
std::vector<char> buffer(size);
/*/
// Windows API (I would use this)
std::vector<char> buffer;
int size = WideCharToMultiByte(CP_UTF8, 0, text, -1, NULL, 0, NULL, NULL);
if (size > 0) {
buffer.resize(size);
WideCharToMultiByte(CP_UTF8, 0, text, -1, static_cast<BYTE*>(&buffer[0]), buffer.size(), NULL, NULL);
}
else {
// Error handling
}
//*/
std::string string(&buffer[0]);
#else
std::string string(text);
#endif
Run Code Online (Sandbox Code Playgroud)
TCHAR 要么是 char 要么是 wchar_t,所以
typedef basic_string<TCHAR> tstring;
Run Code Online (Sandbox Code Playgroud)
是一种方法。
另一种是char
完全跳过,只使用std::wstring
.
小智 5
我的回答晚了,我承认这一点,但是通过“Alok Save”的答案和一些研究,我找到了一个好方法!(注意:我没有经常测试这个版本,所以它可能不适用于所有情况,但从我测试的情况来看应该是):
TCHAR t = SomeFunctionReturningTCHAR();
std::string str;
#ifndef UNICODE
str = t;
#else
std::wstring wStr = t;
str = std::string(wStr.begin(), wStr.end());
#endif
std::cout << str << std::endl; //<-- should work!
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
63861 次 |
最近记录: |