我正在使用c ++中的crossplatrofm项目工作,我的变量类型为std::string
,需要将其转换为const TCHAR *
- 什么是正确的方法,可能是来自某个库的函数?
UPD 1 : - 正如我在函数定义中看到的那样,有分割窗口和非Windows实现:
#if defined _MSC_VER || defined __MINGW32__
#define _tinydir_char_t TCHAR
#else
#define _tinydir_char_t char
#endif
- 对std::string
的发送参数的非拆分实现是否真的没办法?
答案 0 :(得分:2)
适当的方式crossplatfom从std :: string转换为' const TCHAR *'
TCHAR
根本不应该用于跨平台程序;当然,当与Windows API调用交互时,那些需要从程序的其余部分抽象出来,否则它就不会是跨平台的。因此,您只需要在Windows特定代码中的TCHAR
字符串和char
字符串之间进行转换。
程序的其余部分应使用char
,并且最好假设它包含UTF-8编码的字符串。如果用户输入或系统调用返回不同编码的字符串,则需要确定编码是什么,并相应地进行转换。
C ++标准库的字符编码转换功能相当薄弱,因此没有多大用处。您可以根据编码规范实现转换,也可以像往常一样使用第三方实现。
可能是某些图书馆的功能吗?
我推荐这个。
正如我在函数定义中看到的那样,存在拆分窗口和非Windows实现
您使用的库不能为不同平台提供统一的API,因此无法以真正的跨平台方式使用。您可以编写一个包含统一函数声明的包装器库,以便在需要它的平台上处理字符编码转换。
或者,您可以使用另一个库,它提供统一的API并透明地转换编码。
答案 1 :(得分:1)
前几天我遇到了boost.nowide。我认为它会完全符合您的要求。
答案 2 :(得分:1)
TCHAR
是Windows类型,它以这种方式定义:
#ifdef UNICODE
typedef wchar_t TCHAR, *PTCHAR;
#else
typedef char TCHAR, *PTCHAR;
#endif
UNICODE
宏通常在项目设置中定义(如果您在Windows上使用Visual Studio项目)。
您可以通过以下方式从const TCHAR*
(大多数情况下为ASCII或UTF8)获取std::string
:
std::string s("hello world");
const TCHAR* pstring = nullptr;
#ifdef UNICODE
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
std::wstring wstr = converter.from_bytes(s);
pstring = wstr.data();
#else
pstring = s.data();
#endif
pstring
将是结果。
但我们强烈建议不要在其他平台上使用TCHAR
。在std::string
答案 3 :(得分:1)
正如其他人所指出的那样,除了与Windows API接口的代码(或在Windows API之后建模的库)之外,您不应该使用TCHAR。
另一种方法是使用atlconv.h中定义的字符转换类/宏。 CA2T会将8位字符串转换为TCHAR字符串。 CA2CT将转换为const TCHAR字符串(LPCTSTR)。假设您的8位字符串是UTF-8,您应该指定CP_UTF8作为转换的代码页。
如果要声明包含std :: string的TCHAR副本的变量:
CA2T tstr(stdstr.c_str(), CP_UTF8);
如果你想调用一个带LPCTSTR的函数:
FunctionThatTakesString(CA2CT(stdsr.c_str(), CP_UTF8));
如果要从TCHAR字符串构造std :: string:
std::string mystdstring(CT2CA(tstr, CP_UTF8));
如果你想调用一个带有LPTSTR的函数,那么你可能不应该使用这些转换类。 (但是如果你知道你正在调用的函数不会修改当前长度之外的字符串,你就可以了。)