正确的方法crossplatfom从std :: string转换为'const TCHAR *'

时间:2017-07-19 11:32:34

标签: c++ cross-platform multiplatform

我正在使用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的发送参数的非拆分实现是否真的没办法?

4 个答案:

答案 0 :(得分:2)

  

适当的方式crossplatfom从std :: string转换为' const TCHAR *'

TCHAR根本不应该用于跨平台程序;当然,当与Windows API调用交互时,那些需要从程序的其余部分抽象出来,否则它就不会是跨平台的。因此,您只需要在Windows特定代码中的TCHAR字符串和char字符串之间进行转换。

程序的其余部分应使用char,并且最好假设它包含UTF-8编码的字符串。如果用户输入或系统调用返回不同编码的字符串,则需要确定编码是什么,并相应地进行转换。

C ++标准库的字符编码转换功能相当薄弱,因此没有多大用处。您可以根据编码规范实现转换,也可以像往常一样使用第三方实现。

  

可能是某些图书馆的功能吗?

我推荐这个。

  

正如我在函数定义中看到的那样,存在拆分窗口和非Windows实现

您使用的库不能为不同平台提供统一的API,因此无法以真正的跨平台方式使用。您可以编写一个包含统一函数声明的包装器库,以便在需要它的平台上处理字符编码转换。

或者,您可以使用另一个库,它提供统一的API并透明地转换编码。

答案 1 :(得分:1)

前几天我遇到了boost.nowide。我认为它会完全符合您的要求。

http://cppcms.com/files/nowide/html/

答案 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

中使用UTF8字符串(char *)会更好

答案 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的函数,那么你可能不应该使用这些转换类。 (但是如果你知道你正在调用的函数不会修改当前长度之外的字符串,你就可以了。)