如何将TCHAR数组转换为std::string(不是std::basic_string)?
我正在尝试编写跨平台的i18n C++代码.由于大多数linux系统更喜欢使用UTF-8作为字符编码,我认为我应该在Linux上使用string,在Windows上使用wstring.Linux上有tchar.h吗?什么是Linux上的tchar.h的等效替换?
我正在尝试将TCHAR转换为字符串,如下所示:
std::string mypath;
TCHAR path[MAX_PATH];
GetModuleFileName( NULL, path, MAX_PATH );
Run Code Online (Sandbox Code Playgroud)
我需要设置mypath到的path.我做了一个简单的循环并连接path[index]到了mypath,这有效,但我不喜欢这种方式.
我是C++的新手,但已经做了很多C#.我已经看过GetModuleFileName传入"char"的例子,但它不喜欢它.它需要TCHAR或者a LPWSTR.
这似乎是一个非常柔软的问题,但我总是很难查找这个函数,因为似乎有很多关于char和tchar的引用的变化.
TCHAR我的C++代码中有一个数组,我想为它分配静态字符串.
我通过它设置了一个初始字符串
TCHAR myVariable[260] = TEXT("initial value");
Run Code Online (Sandbox Code Playgroud)
这一切都很好.但是,当我将它分成两行时,如同
TCHAR myVariable[260];
myVariable = TEXT("initial value");
Run Code Online (Sandbox Code Playgroud)
它会出错并给出编译器错误:
错误C2440:'=':无法从'const char [14]'转换为'TCHAR [260]'
该TEXT()功能不应该完全符合我的要求吗?将给定的字符串转换为TCHARs?将两条线放在一起时,为什么会起作用?为了让它工作,我需要改变什么?
我遇到的其他一些令人困惑的事情:
我搜索了它的互联网和已经看到,也有_T()和_TEXT()和__T()和__TEXT().它们适用于什么?我应该在什么环境中使用哪一个?
是否建议使用strcmp或_tcscmp来比较Unicode版本中的字符串?
我确信以下有一个合理的解释,但我有点困惑.
问题在于创建a _TCHAR[CONSTANT],a _TCHAR*,连接它们并返回结果的函数.
由于某种原因,whatTheHeck()来自_tmain()回归的胡言乱语.
_TCHAR* whatTheHeck(_TCHAR* name) {
_TCHAR Buffer[BUFSIZE];
DWORD dwRet;
dwRet = GetCurrentDirectory(BUFSIZE, Buffer);
_TCHAR* what = new _TCHAR[BUFSIZE];
what = _tcscat(Buffer, TEXT("\\"));
what = _tcscat(what, name);
return what;
}
int _tmain(int argc, _TCHAR* argv[]) {
_TCHAR* failure = whatTheHeck(TEXT("gibberish);")); // not again ..
_tprintf(TEXT("|--> %s\n"), failure);
_TCHAR* success = createFileName(TEXT("readme.txt")); // much better
_tprintf(TEXT("|--> %s\n"), success);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
相反,当与堆一起工作时,按预期工作.
_TCHAR* createFileName(_TCHAR* name) {
_TCHAR* Buffer = new _TCHAR[BUFSIZE];
DWORD …Run Code Online (Sandbox Code Playgroud) 我们需要将一个格式_TCHAR*字符串和一些char*字符串传递给一个带有可变长度args的函数:
inline void FooBar(const _TCHAR *szFmt, const char *cArgs, ...) {
//...
}
Run Code Online (Sandbox Code Playgroud)
所以它可以这样调用:
char *foo = "foo";
char *bar = "bar";
LogToFileA(_T("Test %s %s"), foo, bar);
Run Code Online (Sandbox Code Playgroud)
显然,一个简单的解决方法是使用_TCHAR而不是char,但遗憾的是我们并没有那么奢侈.
我们需要将它与va_start等一起使用,以便我们可以格式化一个字符串:
va_list args;
_TCHAR szBuf[BUFFER_MED_SIZE];
va_start(args, cArgs);
_vstprintf_s(szBuf, BUFFER_MED_SIZE, szFmt, args);
va_end(args);
Run Code Online (Sandbox Code Playgroud)
不幸的是我们不能使用它,因为它给了我们这个错误:
Unhandled exception at 0x6a0d7f4f (msvcr90d.dll) in foobar.exe:
0xC0000005: Access violation reading location 0x2d86fead.
Run Code Online (Sandbox Code Playgroud)
我想我们需要将我们的char*转换为_TCHAR* - 但是如何?
我正在修改一些非常古老的(10年)C代码.该代码在Unix/Mac上使用GCC进行编译,并使用MinGW对Windows进行交叉编译.目前整个都有TCHAR字符串.我想摆脱TCHAR并使用C++字符串代替.是否仍然需要使用Windows范围的功能,或者我现在可以使用Unicode和UTF-8完成所有操作吗?