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

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

我正在为 c++ 中的 crossplatrofm 项目工作,我有类型为 std::string 的变量,需要将其转换为 const TCHAR * - 正确的方法是什么,可能是某些库中的函数?

UPD 1:-正如我在函数定义中看到的那样,有拆分 windows 和非 Windows 实现:

#if defined _MSC_VER || defined __MINGW32__
#define _tinydir_char_t TCHAR
#else
#define _tinydir_char_t char
#endif

-那么从std::string发送参数的非拆分实现真的没有办法吗?

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

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

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

TCHAR 根本不应该在跨平台程序中使用;当然,在与 windows API 调用交互时除外,但这些需要从程序的其余部分中抽象出来,否则它不会跨平台。因此,您只需要在 windows 特定代码中实现 TCHAR 字符串和 char 字符串之间的转换。

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

C++标准库的字符编码转换功能比较弱,用处不大。您可以根据编码规范实现转换,也可以像往常一样使用第三方实现。

may be functions from some library ?

我推荐这个。

as I see in function definition there is split windows and non-Windows implementations

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

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

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 中定义的字符转换 classes/macros。 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 的函数,那么您可能不应该使用这些转换 类。 (但如果您知道您正在调用的函数不会修改超出其当前长度的字符串,您就可以。)