繁体   English   中英

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

[英]Proper way crossplatfom convert from std::string to 'const TCHAR *'

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

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

TCHAR不应在跨平台程序中使用TCHAR 当然,与Windows API调用进行交互时,除了需要从程序的其余部分中抽象出来之外,否则它们将不是跨平台的。 因此,您只需要在Windows特定代码中的TCHAR字符串和char字符串之间进行转换。

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

C ++标准库的字符编码转换功能相当弱,因此使用不多。 您可以按照编码规范实施转换,也可以像往常一样使用第三方实施。

可能是某些库中的函数?

我推荐这个。

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

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

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

前几天,我遇到了boost.nowide。 我认为它将完全满足您的要求。

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

TCHAR是Windows类型,它是通过以下方式定义的:

#ifdef  UNICODE                     
typedef wchar_t TCHAR, *PTCHAR;
#else
typedef char TCHAR, *PTCHAR;
#endif

通常在项目设置中定义UNICODE宏(以防万一,如果您在Windows上使用Visual Studio项目)。

您可以通过以下方式从std::string (大多数情况下为ASCII或UTF8)获取const TCHAR*

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 *)

正如其他人指出的那样,除了在与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的函数,则可能不应该使用这些转换类。 (但是,如果您知道所调用的函数不会在当前长度之外修改字符串,则可以。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM