正确的方式 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。我认为它会完全满足您的要求。
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 的函数,那么您可能不应该使用这些转换 类。 (但如果您知道您正在调用的函数不会修改超出其当前长度的字符串,您就可以。)
我正在为 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。我认为它会完全满足您的要求。
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
正如其他人指出的那样,除了在与 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 的函数,那么您可能不应该使用这些转换 类。 (但如果您知道您正在调用的函数不会修改超出其当前长度的字符串,您就可以。)