在ostringstream中使用TCHAR P>好,我不是C++的人,这可能会被否决,因为我只是阅读代码和基于我知道的其他语言进行猜测(我知道,但是我只想用一个小的改动编译一个解决方案)

在ostringstream中使用TCHAR P>好,我不是C++的人,这可能会被否决,因为我只是阅读代码和基于我知道的其他语言进行猜测(我知道,但是我只想用一个小的改动编译一个解决方案),c++,std,tchar,C++,Std,Tchar,如您所见,程序正在读取一个ini文件,将API密钥写入szAPI,然后我需要在ostringstream(buf)中使用它。当我查看PHP中的POST变量时,它给了我一个8位十六进制“0019EEE0”,而我希望它在ini文件中给出一个32个字符长的字母数字字符串。我研究了如何将tchar转换为字符串,但没有任何东西真正适合我。当我把 #ifndef UNICODE typedef std::string szAPI; #else typedef std::wstring szAP

如您所见,程序正在读取一个ini文件,将API密钥写入szAPI,然后我需要在ostringstream(buf)中使用它。当我查看PHP中的POST变量时,它给了我一个8位十六进制“0019EEE0”,而我希望它在ini文件中给出一个32个字符长的字母数字字符串。我研究了如何将tchar转换为字符串,但没有任何东西真正适合我。当我把

#ifndef UNICODE  
  typedef std::string szAPI; 
#else
  typedef std::wstring szAPI; 
#endif
在头文件中,什么也没有发生,当我纠正变量应该转换为字符串时,它会出错(不能用typedef重载符号)

我会使用TCHAR来生成标题,但我不知道如何使用代码将图像放在api标题正下方的标题中

所以我有点不知所措。我需要的API密钥是在ini文件,这样我就可以建立一个php与生成的ini文件和exe压缩,然后发送出去,这样我就可以跟踪谁是上传什么到我的服务器


如果您有任何想法,谢谢。

好的,这可能不是最好的方法,但我已经尝试了几个小时,它开始工作了

...

GetPrivateProfileString(_T("Configuration"), _T("SERVER"), UPLOAD_SERVER, szUploadServer, sizeof(szUploadServer) / sizeof(TCHAR), szWD);
GetPrivateProfileString(_T("Configuration"), _T("PATH"), UPLOAD_PATH, szUploadPath, sizeof(szUploadPath) / sizeof(TCHAR), szWD);
GetPrivateProfileString(_T("Configuration"), _T("API"), API_KEY, szAPI, sizeof(szAPI) / sizeof(TCHAR), szWD);
char api[MAX_PATH];
wcstombs(api, szAPI, wcslen(szAPI) + 1);

...

正如您所注意到的,Windows使用UTF16,但internet功能需要UTF8

char api[MAX_PATH];
wcstombs(api, szAPI, wcslen(szAPI) + 1);
这种转换并不总是有效的

通常,必须使用
WideCharToMultiByte
将UTF16转换为UTF8

因为您使用的是VisualStudio,所以为了方便起见,可以使用ATL类

#include <AtlStr.h>

...
CStringA sA = CW2A(szAPI, CP_UTF8);


由于您打算在Win32中使用代码,因此最干净的方法是使用
std::wostringstream
而不是
std::ostringstream
使字符串操作在UCS-16空间上工作


另一种解决方法是使用Win32 ANSI函数处理多字节空间(例如,
GetPrivateProfileStringA()
),前提是ANSI函数中那些讨厌的i18n问题在您的应用程序中不存在。

TCHAR的目的是使为Windows 9x构建程序成为可能,这样它就可以在Windows9x中为有限的本地字符集工作。这种丑陋的基于宏的设备在2000年因Unicode层的引入而被淘汰。几年后,Windows9X不再流行。您确定您的目标是Windows 9x,并且您有充分的理由不将该层用于Unicode吗?如果没有,你到底为什么要使用
TCHAR
?在现代Windows中,只需使用宽字符(
wchar\t
基于字符串和函数)就可以了。除了Windows API包装器之外,不要将TCHAR用于任何东西。它的目的是在ANSI字符编码和宽字符之间转换。就C stdlib而言,TCHAR并不存在。决定您的软件使用哪种字符编码,并使用适当的标准库函数。在这种情况下,我几乎认为如果您在所有地方都使用
wchar\t
,然后使用
HttpSendRequestW
,一切都会变得更简单。它将处理任何转换为ANSI字符编码的必要操作。@Cheersandhth.-Alf我有点希望他们能转换回8位字符,这次只有UTF-8。谢谢你。utf16似乎在所有情况下都能正常工作,但我换了这个,它也能正常工作。我确实需要在php文件上传的标题中为imagedata提供一个文件名。
char api[MAX_PATH];
wcstombs(api, szAPI, wcslen(szAPI) + 1);
#include <AtlStr.h>

...
CStringA sA = CW2A(szAPI, CP_UTF8);
my_ostringstream << sA.GetString();
HttpSendRequest(hRequest, szHeader, lstrlen(szHeader),
    (LPVOID)sA.GetString(), (DWORD)sA.GetLength());